diff --git a/lib/file-control-xhr.php b/lib/file-control-xhr.php
deleted file mode 100644
index 4138a30..0000000
--- a/lib/file-control-xhr.php
+++ /dev/null
@@ -1,1045 +0,0 @@
-' . $t['Saving'] . '
" + "'.("Save" === $finalAction ? "newFileName" : "'" . $fileName . "'") . '");
- }
- }
- },10);
- };
-
- /* UI dialog cancelling and saving contents for save as looparound */
- if (!newFileName || newFileName && !overwriteOK) {
- ICEcoder.saveAsContent = document.getElementById(\'saveTemp1\').value;
- ICEcoder.serverMessage();ICEcoder.serverQueue("del", 0);
- }';
-
- // ===================
- // FILE CONTENT SAVING
- // ===================
-
- } elseif (isset($_POST['changes']) || isset($_POST['contents'])) {
- $finalAction = isset($_POST["newFileName"]) ? "save as" : "save";
-
- // =================
- // FILE IS WRITEABLE
- // =================
-
- if (!$demoMode && (isset($ftpSite) || (file_exists($file) && is_writable($file)) || isset($_POST['newFileName']) && "" != $_POST['newFileName'])) {
-
- $filemtime = !isset($ftpSite) && "Linux" === $serverType ? filemtime($file) : "1000000";
-
- // =======================
- // MDT'S MATCH, WRITE FILE
- // =======================
-
- if (!(isset($_GET['fileMDT'])) || $filemtime == $_GET['fileMDT']) {
-
- // FTP Saving
- if (isset($ftpSite)) {
- $ftpFilepath = ltrim($fileLoc . "/" . $fileName, "/");
- if (isset($_POST['changes'])) {
- // Get existing file contents as lines
- $loadedFile = toUTF8noBOM(ftpGetContents($ftpConn, $ftpRoot . $fileLoc . "/" . $fileName, $ftpMode), false);
- $fileLines = explode("\n", str_replace("\r", "", $loadedFile));
- // Need to add a new line at the end of each because explode will lose them,
- // want want to end up with same array that 'file($file)' produces for a local file
- // - it keeps the line endings at the end of each array item
- for ($i = 0; $i < count($fileLines); $i++) {
- if ($i < count($fileLines) - 1) {
- $fileLines[$i] .= $ICEcoder["lineEnding"];
- }
- }
- // Stitch changes onto it
- $contents = stitchChanges($fileLines);
-
- // get old file contents and count stats on usage \n and \r there
- // in this case we can keep line endings, which file had before, without
- // making code version control systems going crazy about line endings change in whole file.
- $unixNewLines = preg_match_all('/[^\r][\n]/u', $loadedFile);
- $windowsNewLines = preg_match_all('/[\r][\n]/u', $loadedFile);
- } else {
- $contents = $_POST['contents'];
- }
-
- // replace \r\n (Windows), \r (old Mac) and \n (Linux) line endings with whatever we chose to be lineEnding
- $contents = str_replace("\r\n", $ICEcoder["lineEnding"], $contents);
- $contents = str_replace("\r", $ICEcoder["lineEnding"], $contents);
- $contents = str_replace("\n", $ICEcoder["lineEnding"], $contents);
- if (isset($_POST['changes']) && ($unixNewLines > 0) || ($windowsNewLines > 0)) {
- if ($unixNewLines > $windowsNewLines){
- $contents = str_replace($ICEcoder["lineEnding"], "\n", $contents);
- } elseif ($windowsNewLines > $unixNewLines){
- $contents = str_replace($ICEcoder["lineEnding"], "\r\n", $contents);
- }
- }
- // Write our file contents
- if (!ftpWriteFile($ftpConn, $ftpFilepath, $contents, $ftpMode)) {
- $doNext .= 'ICEcoder.message("Sorry, could not write ' . $ftpFilepath . ' at ' . $ftpHost . '");';
- } else {
- $doNext .= 'ICEcoder.openFileMDTs[ICEcoder.selectedTab - 1]="' . $filemtime . '";';
- $doNext .= '(function() {var x = ICEcoder.openFileVersions; var y = ICEcoder.selectedTab-1; x[y] = "undefined" != typeof x[y] ? x[y] + 1 : 1})(); ICEcoder.updateVersionsDisplay();';
- }
- // Local saving
- } else {
- if (isset($_POST['changes'])) {
- // Get existing file contents as lines and stitch changes onto it
- $fileLines = file($file);
- $contents = stitchChanges($fileLines);
-
- // get old file contents, and count stats on usage \n and \r there
- // in this case we can keep line endings, which file had before, without
- // making code version control systems going crazy about line endings change in whole file.
- $oldContents = file_exists($file) ? getData($file) : '';
- $unixNewLines = preg_match_all('/[^\r][\n]/u', $oldContents);
- $windowsNewLines = preg_match_all('/[\r][\n]/u', $oldContents);
- } else {
- $contents = $_POST['contents'];
- }
-
- // Newly created files have the perms set too
- $setPerms = (!file_exists($file)) ? true : false;
- $fh = fopen($file, 'w') or die($t['Sorry, cannot save']);
-
- // replace \r\n (Windows), \r (old Mac) and \n (Linux) line endings with whatever we chose to be lineEnding
- $contents = str_replace("\r\n", $ICEcoder["lineEnding"], $contents);
- $contents = str_replace("\r", $ICEcoder["lineEnding"], $contents);
- $contents = str_replace("\n", $ICEcoder["lineEnding"], $contents);
- if (isset($_POST['changes']) && (0 < $unixNewLines) || (0 < $windowsNewLines)) {
- if ($unixNewLines > $windowsNewLines){
- $contents = str_replace($ICEcoder["lineEnding"], "\n", $contents);
- } elseif ($windowsNewLines > $unixNewLines){
- $contents = str_replace($ICEcoder["lineEnding"], "\r\n", $contents);
- }
- }
- // Now write that content, close the file and clear the statcache
- fwrite($fh, $contents);
- fclose($fh);
-
- if ($setPerms) {
- chmod($file, octdec($ICEcoder['newFilePerms']));
- }
- clearstatcache();
- $filemtime = "Linux" === $serverType ? filemtime($file) : "1000000";
- $doNext .= 'ICEcoder.openFileMDTs[ICEcoder.selectedTab - 1] = "' . $filemtime . '";';
- $doNext .= '(function() {var x = ICEcoder.openFileVersions; var y = ICEcoder.selectedTab-1; x[y] = "undefined" != typeof x[y] ? x[y] + 1 : 1})(); ICEcoder.updateVersionsDisplay();';
- }
-
- // Save a version controlled backup source of the file
- if ($ICEcoder["backupsKept"]) {
- $backupDirFormat = "Y-m-d";
-
- // Establish the base, host and date dir parts...
- $backupDirBase = str_replace("\\", "/", dirname(__FILE__)) . "/../data/backups/";
- $backupDirHost = isset($ftpSite) ? parse_url($ftpSite, PHP_URL_HOST) : "localhost";
- $backupDirDate = date($backupDirFormat);
-
- // Establish an array of dirs from base to our file location
- $subDirsArray = explode("/", ltrim($fileLoc, "/"));
- array_unshift($subDirsArray, $backupDirHost, $backupDirDate);
- // Make any dirs that don't exist if full path isn't there
- if (!is_dir($backupDirBase . implode("/", $subDirsArray))) {
- $pathIncr = "";
- for ($i = 0; $i < count($subDirsArray); $i++) {
- $pathIncr .= $subDirsArray[$i] . "/";
- // If this subdir isn't there, make it
- if (!is_dir($backupDirBase . $pathIncr)) {
- mkdir($backupDirBase . $pathIncr);
- }
- }
- }
- // We should have our dir path now so set that
- $backupDir = $backupDirBase . implode("/", $subDirsArray);
- // Work out an available filename (we postfix a number in parens)
- for ($i = 1; $i < 1000000000; $i++) {
- if (!file_exists($backupDir . '/' . $fileName . " (" . $i . ")")) {
- $backupFileName = $fileName . " (" . $i . ")";
- $backupFileNum = $i;
- $i = 1000000000;
- }
- }
-
- // Now save within that backup dir and clear the statcache
- $fh = fopen($backupDir . "/" . $backupFileName, "w") or die($t['Sorry, cannot save...']);
- fwrite($fh, $contents);
- fclose($fh);
- clearstatcache();
-
- // Log the version count in an index file, which contains saved version counts
- $backupIndex = $backupDirBase . $backupDirHost . "/" . $backupDirDate . "/.versions-index";
- // Have a version index already? Update contents
- if (file_exists($backupIndex)) {
- $versionsInfo = "";
- $versionsInfoOrig = getData($backupIndex);
- $versionsInfoOrig = explode("\n", $versionsInfoOrig);
- $replacedLine = false;
- // For each line, either re-set number or simply include the line
- for ($i = 0; $i < count($versionsInfoOrig); $i++) {
- if (0 === strpos($versionsInfoOrig[$i], $fileLoc . "/" . $fileName . " = ")) {
- $versionsInfo .= $fileLoc . "/" . $fileName . " = " . $backupFileNum . PHP_EOL;
- $replacedLine = true;
- } else {
- $versionsInfo .= $versionsInfoOrig[$i] . PHP_EOL;
- }
- }
- // Didn't find our line in the file? Add it to the end
- if (!$replacedLine) {
- $versionsInfo .= $fileLoc . "/" . $fileName . " = " . $backupFileNum . PHP_EOL;
- }
- // No version file yet, set the first line
- } else {
- $versionsInfo = $fileLoc . "/" . $fileName . " = " . $backupFileNum . PHP_EOL;
- }
- $versionsInfo = rtrim($versionsInfo, PHP_EOL);
- $fh = fopen($backupIndex, 'w') or die($t['Sorry, cannot save...']);
- fwrite($fh, $versionsInfo);
- fclose($fh);
- clearstatcache();
-
- // Finally, clear any old backup dirs than user set X days (inclusive)
- $backupDirsList = scandir($backupDirBase . $backupDirHost);
- $backupDirsKeep = array();
- for ($i = 0; $i <= $ICEcoder["backupsDays"]; $i++) {
- $backupDirsKeep[] = date($backupDirFormat, strtotime('-' . $i . ' day', strtotime($backupDirDate)));
- }
- for ($i = 0; $i < count($backupDirsList); $i++) {
- if ("." !== $backupDirsList[$i] && ".." !== $backupDirsList[$i] && !in_array($backupDirsList[$i], $backupDirsKeep)) {
- rrmdir($backupDirBase . $backupDirHost . "/" . $backupDirsList[$i]);
- }
- }
- }
-
- // Reload file manager, rename tab & remove old file highlighting if it was a new file
- if (isset($_POST['newFileName']) && "" != $_POST['newFileName']) {
- $doNext .= 'ICEcoder.selectedFiles=[]; ICEcoder.updateFileManagerList(\'add\', \'' . $fileLoc . '\', \'' . $fileName . '\', false, false, false, \'file\');';
- $doNext .= 'ICEcoder.renameTab(ICEcoder.selectedTab, \'' . $fileLoc . "/" . $fileName . '\');';
- if (!strpos($_REQUEST['file'], "[NEW]")) {
- // We're saving as a new file, so unhighlight the old name in the file manager if visible
- $doNext .= "fileLink = ICEcoder.filesFrame.contentWindow.document.getElementById('" . str_replace("/", "|", $fileLoc) . "|". basename($_REQUEST['file']). "');";
- $doNext .= "if (fileLink) {fileLink.style.backgroundColor = ICEcoder.tabBGnormal; fileLink.style.color = ICEcoder.tabFGnormalFile};";
- }
- }
- // Reload previewWindow window if not a Markdown file
- // In doing this, we check on an interval for the page to be complete and if we last saw it loading
- // When we are done loading, so set the loading status to false and load plugins on..
- $doNext .= 'if (ICEcoder.previewWindow.location && ICEcoder.previewWindow.location.pathname && -1 === ICEcoder.previewWindow.location.pathname.indexOf(".md")) {
- ICEcoder.previewWindowLoading = false;
- ICEcoder.previewWindow.location.reload(true);
-
- ICEcoder.checkPreviewWindowLoadingInt = setInterval(function() {
- if ("loading" !== ICEcoder.previewWindow.document.readyState && ICEcoder.previewWindowLoading) {
- ICEcoder.previewWindowLoading = false;
- try {ICEcoder.doPesticide();} catch(err) {};
- try {ICEcoder.doStatsJS(\'save\');} catch(err) {};
- try {ICEcoder.doResponsive();} catch(err) {};
- clearInterval(ICEcoder.checkPreviewWindowLoadingInt);
- } else {
- ICEcoder.previewWindowLoading = "loading" === ICEcoder.previewWindow.document.readyState ? true : false;
- }
- }, 4);
-
- };';
-
- // Copy over content to diff pane if we have that setting on
- $doNext .= '
- cM = ICEcoder.getcMInstance();
- cMdiff = ICEcoder.getcMdiffInstance();
- if (ICEcoder.updateDiffOnSave) {
- cMdiff.setValue(cM.getValue());
- };
- ';
-
- // Finally, set previous files, indicate changes, set saved points and redo tabs
- $doNext .= '
- ICEcoder.setPreviousFiles();
- setTimeout(function(){ICEcoder.indicateChanges()}, 4);
- ICEcoder.savedPoints[ICEcoder.selectedTab-1] = cM.changeGeneration();
- ICEcoder.savedContents[ICEcoder.selectedTab-1] = cM.getValue();
- ICEcoder.redoTabHighlight(ICEcoder.selectedTab);';
-
- include_once "on-file-save.php";
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onFileSave($doNext);
-
- // ======================================================
- // MDT'S DON'T MATCH, OFFER TO LOAD FILE & SHOW DIFF VIEW
- // ======================================================
-
- } else {
- // Only applicable for local files
- $loadedFile = toUTF8noBOM(getData($file), true);
- $fileCountInfo = getVersionsCount($fileLoc, $fileName);
- $doNext .= '
- var loadedFile = document.createElement("textarea");
- loadedFile.value = "' . str_replace('"', '\\\"', str_replace("\r", "\\\\r", str_replace("\n", "\\\\n", str_replace("", "", $loadedFile)))).'";
- var refreshFile = ICEcoder.ask("' . $t['Sorry, this file...'] . '\\\n' . $file . '\\\n\\\n' . $t['Reload this file...'] . '");
- if (refreshFile) {
- var cM = ICEcoder.getcMInstance();
- var thisTab = ICEcoder.selectedTab;
- var userVersionFile = cM.getValue();
- /* Revert back to original */
- cM.setValue(loadedFile.value);
- ICEcoder.savedPoints[thisTab - 1] = cM.changeGeneration();
- ICEcoder.savedContents[thisTab - 1] = cM.getValue();
- ICEcoder.openFileMDTs[ICEcoder.selectedTab - 1] = "' . $filemtime . '";
- ICEcoder.openFileVersions[ICEcoder.selectedTab - 1] = "' . $fileCountInfo['count'] . '";
- cM.clearHistory();
- /* Now for the new version in the diff pane */
- ICEcoder.setSplitPane(\'on\');
- var cMdiff = ICEcoder.getcMdiffInstance();
- cMdiff.setValue(userVersionFile);
- };';
- $finalAction = "nothing";
- }
-
- // ===================
- // FILE IS UNWRITEABLE
- // ===================
-
- } else {
- $finalAction = "nothing";
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot save'] . "\\\\n" . $file . "');";
- }
- $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
- }
-};
-
-// ==========
-// NEW FOLDER
-// ==========
-
-if (!$error && "newFolder" === $_GET['action']) {
- if (!$demoMode && (isset($ftpSite) || is_writable($docRoot.$fileLoc))) {
- $updateFM = false;
- // FTP
- if (isset($ftpSite)) {
- $ftpFilepath = ltrim($fileLoc . "/" . $fileName, "/");
- if (!ftpMkDir($ftpConn, octdec($ICEcoder['newDirPerms']), $ftpFilepath)) {
- $doNext .= 'ICEcoder.message("Sorry, could not create dir '.$ftpFilepath.' at ' . $ftpHost . '");';
- } else {
- $updateFM = true;
- }
- // Local
- } else {
- mkdir($file, octdec($ICEcoder['newDirPerms']));
- // Reload file manager
- $updateFM = true;
- }
- // Update file manager on success
- if ($updateFM) {
- $doNext .= 'ICEcoder.selectedFiles=[]; ICEcoder.updateFileManagerList(\'add\', \'' . $fileLoc . '\', \'' . $fileName . '\', false, false, false, \'folder\');';
- }
- $finalAction = "newFolder";
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onDirNew($doNext);
- } else {
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot create...'] . "\\\\n" . $fileLoc . "');";
- $finalAction = "nothing";
- }
- $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
-};
-
-// ================
-// MOVE FILE/FOLDER
-// ================
-
-if (!$error && "move" === $_GET['action']) {
- if (isset($ftpSite)) {
- $srcDir = ltrim(str_replace("|", "/", $_GET['oldFileName']), "/");
- $tgtDir = ltrim($fileLoc . "/" . $fileName, "/");
- } else {
- $srcDir = $docRoot . $iceRoot . str_replace("|", "/", $_GET['oldFileName']);
- $tgtDir = $docRoot . $fileLoc . "/" . $fileName;
- }
- if ($srcDir != $tgtDir && $fileLoc != "") {
- if (!$demoMode && (isset($ftpSite) || is_writable($srcDir))) {
- $updateFM = false;
- // FTP
- if (isset($ftpSite)) {
- if (!ftpRename($ftpConn, $srcDir, $tgtDir)) {
- $doNext .= 'ICEcoder.message("Sorry, could not rename ' . $srcDir . ' to ' . $tgtDir . '");';
- } else {
- $ftpFileDirInfo = ftpGetFileInfo($ftpConn, ltrim($fileLoc, "/"), $fileName);
- $fileOrFolder = "directory" === $ftpFileDirInfo['type'] ? "folder" : "file";
- $updateFM = true;
- }
- // Local
- } else {
- if(rename($srcDir, $tgtDir)) {
- // Is a dir or file (needed to create new item in file manager)
- $fileOrFolder = is_dir($docRoot . $fileLoc . "/" . $fileName) ? "folder" : "file";
- $updateFM = true;
- }
- }
- // Update file manager on success
- if ($updateFM) {
- $doNext .= 'ICEcoder.selectedFiles=[]; ICEcoder.updateFileManagerList(\'move\', \'' . $fileLoc . '\', \'' . $fileName . '\', \'\', \'' .str_replace($iceRoot, "", str_replace("|", "/", $_GET['oldFileName'])) . '\', false, \'' . $fileOrFolder . '\');';
- }
- $finalAction = "move";
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onFileDirMove($doNext);
- } else {
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot move'] . "\\\\n" . str_replace("|", "/", $_GET['oldFileName']) . "\\\\n\\\\n" . $t['Maybe public write...'] . "');";
- $finalAction = "nothing";
- }
- } else {
- $doNext .= "";
- $finalAction = "nothing";
- }
- $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
-};
-
-// ==================
-// RENAME FILE/FOLDER
-// ==================
-
-if (!$error && "rename" === $_GET['action']) {
- if (!$demoMode && (isset($ftpSite) || is_writable($docRoot.$iceRoot.str_replace("|", "/", $_GET['oldFileName'])))) {
- $updateFM = false;
- // FTP
- if (isset($ftpSite)) {
- $ftpFilepath = ltrim($fileLoc . "/" . $fileName, "/");
- if (!ftpRename($ftpConn, ltrim($_GET['oldFileName'], "/"), $ftpFilepath)) {
- $doNext .= 'ICEcoder.message("Sorry, could not rename ' . ltrim($_GET['oldFileName'], "/") . ' to ' . $ftpFilepath . '");';
- } else {
- $updateFM = true;
- }
- // Local
- } else {
- rename($docRoot.$iceRoot.str_replace("|", "/", $_GET['oldFileName']), $docRoot . $fileLoc . "/" . $fileName);
- $updateFM = true;
- }
- // Update file manager on success
- if ($updateFM) {
- $doNext .= 'ICEcoder.selectedFiles=[]; ICEcoder.updateFileManagerList(\'rename\', \'' . $fileLoc . '\', \'' . $fileName . '\', \'\', \'' . str_replace($iceRoot, "", $_GET['oldFileName']) . '\');';
- }
- $finalAction = "rename";
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onFileDirRename($doNext);
- } else {
- $doNext .= "ICEcoder.message('".$t['Sorry, cannot rename'] . "\\\\n" . $_GET['oldFileName'] . "\\\\n\\\\n" . $t['Maybe public write...'] . "');";
- $finalAction = "nothing";
- }
- $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
-};
-
-// =================
-// PASTE FILE/FOLDER
-// =================
-
-if (!isset($ftpSite) && !$error && "paste" === $_GET['action']) {
- $source = $file;
- $dest = str_replace("//", "/", $docRoot . $iceRoot . str_replace("|", "/", $_GET['location']) . "/" . basename($source));
- if (!$demoMode && is_writable(dirname($dest))) {
- if (is_dir($source)) {
- $fileOrFolder = "folder";
- if (!is_dir($dest)) {
- mkdir($dest, octdec($ICEcoder['newDirPerms']));
- } else {
- for ($i = 2; $i < 1000000000; $i++) {
- if (!is_dir($dest . " (" . $i . ")")) {
- $dest = $dest." (" . $i . ")";
- mkdir($dest, octdec($ICEcoder['newDirPerms']));
- $i = 1000000000;
- }
- }
- }
- foreach ($iterator = new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
- RecursiveIteratorIterator::SELF_FIRST) as $item
- ) {
- if ($item->isDir()) {
- mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName(), octdec($ICEcoder['newDirPerms']));
- } else {
- copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
- }
- }
- } else {
- $fileOrFolder = "file";
- if (!file_exists($dest)) {
- copy($source, $dest);
- } else {
- for ($i = 2; $i < 1000000000; $i++) {
- if (!file_exists($dest . " (" . $i . ")")) {
- $dest = $dest . " (" . $i . ")";
- copy($source, $dest);
- $i = 1000000000;
- }
- }
- }
- }
- // Reload file manager
- $doNext .= 'ICEcoder.updateFileManagerList(\'add\', \'' . str_replace("|", "/", $_GET['location']) . '\', \'' . basename($dest) . '\', false, false, false, \'' . $fileOrFolder . '\');';
- $finalAction = "pasteFile";
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onFileDirPaste($doNext, $dest);
- } else {
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot copy'] . " \\\\n" . str_replace($docRoot, "", $source) . "\\\\n " . $t['into'] . " \\\\n" . str_replace($docRoot, "", $dest) . "');";
- $finalAction = "nothing";
- }
- $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
-};
-
-// ==============
-// UPLOAD FILE(S)
-// ==============
-
-if (!isset($ftpSite) && !$error && "upload" === $_GET['action']) {
- if (!$demoMode) {
- class fileUploader {
- public function __construct($uploads) {
- global $docRoot, $iceRoot, $ICEcoder, $doNext;
- $uploadDir = $docRoot . $iceRoot . str_replace("..", "", str_replace("|", "/", $_POST['folder'] . "/"));
- foreach($uploads as $current) {
- $this->uploadFile = $uploadDir . $current->name;
- $fileName = $current->name;
- // Get & set existing perms for existing files, or set to newFilePerms setting for new files
- if (file_exists($this->uploadFile)) {
- $chmodInfo = substr(sprintf('%o', fileperms($this->uploadFile)), -4);
- $setPerms = substr($chmodInfo, 1, 3); // reduces 0755 down to 755
- } else {
- $setPerms = $ICEcoder['newFilePerms'];
- }
- if ($this->upload($current, $this->uploadFile, $setPerms)) {
- $doNext .= 'parent.parent.ICEcoder.updateFileManagerList(\'add\', parent.parent.ICEcoder.selectedFiles[parent.parent.ICEcoder.selectedFiles.length - 1].replace(/\|/g, \'/\'), \'' . str_replace("'", "\'", $fileName) . '\', false, false, true, \'file\'); parent.parent.ICEcoder.serverMessage("' . $t['Uploaded file(s) OK'] . '");setTimeout(function(){parent.parent.ICEcoder.serverMessage();}, 2000);';
- $finalAction = "upload";
- } else {
- $doNext .= "parent.parent.ICEcoder.message('" . $t['Sorry, cannot upload'] . " \\\\n" . $fileName . "\\\\n " . $t['into'] . " \\\\n' + parent.parent.ICEcoder.selectedFiles[parent.parent.ICEcoder.selectedFiles.length - 1].replace(/\|/g, '/'));";
- $finalAction = "nothing";
- }
- }
- }
-
- public function upload($current, $uploadFile, $setPerms){
- if (move_uploaded_file($current->tmp_name, $uploadFile)){
- chmod($uploadFile, octdec($setPerms));
- return true;
- }
- }
- }
-
- function getDetails($fileArr) {
- foreach($fileArr['name'] as $keyee => $info) {
- $uploads[$keyee]->name = xssClean($fileArr['name'][$keyee], "html");
- $uploads[$keyee]->type = $fileArr['type'][$keyee];
- $uploads[$keyee]->tmp_name = $fileArr['tmp_name'][$keyee];
- $uploads[$keyee]->error = $fileArr['error'][$keyee];
- }
- return $uploads;
- }
-
- if ($_FILES['filesInput']){
- $uploads = getDetails($_FILES['filesInput']);
- $fileUploader = new fileUploader($uploads);
- }
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onFileUpload($doNext, $uploads);
- } else {
- $doNext .= "parent.parent.ICEcoder.message('" . $t['Sorry, cannot upload...'] . "');";
- $finalAction = "nothing";
- }
-
- $doNext .= "parent.parent.ICEcoder.hideFileMenu(); parent.parent.document.getElementById('fileInput').value = ''; parent.parent.ICEcoder.showHide('hide', parent.parent.document.getElementById('loadingMask'));";
-
- // Upload is not handled by XHR methods, but form post, so we need to manually trigger $doNext in a script tag
- echo "";
-};
-
-// ========================
-// DELETE FILE(S)/FOLDER(S)
-// ========================
-
-if (!$error && "delete" === $_GET['action']) {
- $filesArray = explode(";", $file); // May contain more than one file here
- // FTP
- if (isset($ftpSite)) {
- if (1 === count($filesArray)) {
- $ftpFileDirInfo = ftpGetFileInfo($ftpConn, ltrim($fileLoc, "/"), $fileName);
- $itemType = "directory" === $ftpFileDirInfo['type'] ? "dir" : "file";
- $itemPath = ltrim($fileLoc . "/" . $fileName, "/");
- if (!$demoMode && ftpDelete($ftpConn, $itemType, $itemPath)) {
- if ($fileLoc=="" || "\\" === $fileLoc) {
- $fileLoc = "/";
- };
- // Reload file manager
- $doNext .= 'ICEcoder.selectedFiles = []; ICEcoder.updateFileManagerList(\'delete\', \'' . $fileLoc . '\', \'' . $fileName . '\');';
- $finalAction = "delete";
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onFileDirDelete($doNext);
- } else {
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot delete'] . "\\\\n" . $fileLoc . "/" . $fileName . "');";
- $finalAction = "nothing";
- }
- } else {
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot delete more...'] . "');";
- $finalAction = "nothing";
- }
- // Local
- } else {
- for ($i = 0;$i < count($filesArray); $i++) {
- $fullPath = str_replace($docRoot, "", $filesArray[$i]);
- $fullPath = str_replace($iceRoot, "", $fullPath);
- $fullPath = $docRoot . $iceRoot . $fullPath;
-
- if (rtrim($fullPath, "/") === rtrim($docRoot, "/")) {
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot delete...'] . "');";
- } else if (!$demoMode && is_writable($fullPath)) {
- if (is_dir($fullPath)) {
- rrmdir($fullPath);
- } else {
- // Delete file to tmp dir or full delete
- $ICEcoder['deleteToTmp']
- ? rename($fullPath, str_replace("\\", "/", dirname(__FILE__)) . "/../tmp/." . str_replace(":", "_", str_replace("/", "_", $fullPath)))
- : unlink($fullPath);
- }
- $fileName = basename($fullPath);
- $fileLoc = dirname(str_replace($docRoot, "", $fullPath));
- if ($fileLoc=="" || "\\" === $fileLoc) {
- $fileLoc="/";
- };
- // Reload file manager
- $doNext .= 'ICEcoder.selectedFiles = []; ICEcoder.updateFileManagerList(\'delete\', \'' . $fileLoc . '\', \'' . $fileName . '\');';
- $finalAction = "delete";
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onFileDirDelete($doNext);
- } else {
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot delete'] . "\\\\n" . str_replace($docRoot, "", $fullPath) . "');";
- $finalAction = "nothing";
- }
- }
- }
- $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
-};
-
-// The function to recursively remove folders & files
-function rrmdir($dir) {
- global $ICEcoder;
-
- if (is_dir($dir)) {
- $objects = scandir($dir);
- foreach ($objects as $object) {
- if ("." !== $object && ".." !== $object) {
- if ("dir" === filetype($dir . "/" . $object)) {
- rrmdir($dir . "/" . $object);
- } else {
- $ICEcoder['deleteToTmp']
- ? rename($dir . "/" . $object, str_replace("\\", "/", dirname(__FILE__)) . "/../tmp/." . str_replace(":", "_", str_replace("/", "_", $dir)) . "/" . $object)
- : unlink($dir . "/" . $object);
- }
- }
- }
- reset($objects);
- $ICEcoder['deleteToTmp']
- ? rename($dir, str_replace("\\", "/", dirname(__FILE__)) . "/../tmp/." . str_replace(":", "_", str_replace("/", "_", $dir)))
- : rmdir($dir);
- }
-};
-
-// ======================
-// REPLACE TEXT IN A FILE
-// ======================
-
-if (!isset($ftpSite) && !$error && "replaceText" === $_GET['action']) {
- if (!$demoMode && is_writable($file)) {
- $loadedFile = toUTF8noBOM(getData($file), true);
- $newContent = str_replace($_GET['find'], $_GET['replace'], $loadedFile);
- $fh = fopen($file, 'w') or die($t['Sorry, cannot save']);
- fwrite($fh, $newContent);
- fclose($fh);
- $finalAction = "replaceText";
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onFileReplaceText($doNext, $_GET['fileRef']);
- } else {
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot replace...'] . "\\\\n" . $file . "');";
- $finalAction = "nothing";
- }
- $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
-};
-
-// ==========================
-// GET CONTENTS OF REMOTE URL
-// ==========================
-
-if (!isset($ftpSite) && !$error && "getRemoteFile" === $_GET['action']) {
- $lineNumber = max(isset($_REQUEST['lineNumber']) ? intval($_REQUEST['lineNumber']) : 1, 1);
- if ($remoteFile = toUTF8noBOM(getData($file, 'curl'), true)) {
- // replace \r\n (Windows), \r (old Mac) and \n (Linux) line endings with whatever we chose to be lineEnding
- $remoteFile = str_replace("\r\n", $ICEcoder["lineEnding"], $remoteFile);
- $remoteFile = str_replace("\r", $ICEcoder["lineEnding"], $remoteFile);
- $remoteFile = str_replace("\n", $ICEcoder["lineEnding"], $remoteFile);
- $doNext .= 'ICEcoder.newTab();';
- $doNext .= 'ICEcoder.getcMInstance().setValue(\'' . str_replace("\r", "", str_replace("\t", "\\\\t", str_replace("\n", "\\\\n", str_replace("'", "\\\\'", str_replace("\\", "\\\\", preg_quote($remoteFile)))))) . '\');';
- $doNext .= 'ICEcoder.goToLine(' . $lineNumber . ');';
- $finalAction = "getRemoteFile";
- // Run any extra processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onGetRemoteFile($doNext);
- } else {
- $finalAction = "nothing";
- $doNext .= 'ICEcoder.message(\'' . $t['Sorry, could not...'] . ' '.$file . '\');';
- }
- $doNext .= 'ICEcoder.serverMessage();ICEcoder.serverQueue("del", 0);';
-};
-
-// =======================
-// CHANGING FILE/DIR PERMS
-// =======================
-
-if (!$error && "perms" === $_GET['action']) {
- if (!$demoMode && (isset($ftpSite) || is_writable($file))) {
- $updateFM = false;
- // FTP
- if (isset($ftpSite)) {
- $ftpFilepath = ltrim($fileLoc . "/" . $fileName, "/");
- if (!ftpPerms($ftpConn, octdec(numClean($_GET['perms'])), $ftpFilepath)) {
- $doNext .= 'ICEcoder.message("Sorry, could not set perms on ' . $ftpFilepath . ' at ' . $ftpHost . '");';
- } else {
- $updateFM = true;
- }
- // Local
- } else {
- chmod($file, octdec(numClean($_GET['perms'])));
- // Reload file manager
- $updateFM = true;
- }
- // Update file manager on success
- if ($updateFM) {
- $doNext .= 'ICEcoder.updateFileManagerList(\'chmod\', \'' . $fileLoc . '\', \'' . $fileName . '\', \'' . numClean($_GET['perms']) . '\');';
- }
- $finalAction = "perms";
- // Run any custom processes
- $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
- $doNext = $extraProcesses->onFileDirPerms($doNext, $_GET['perms']);
- } else {
- $finalAction = "nothing";
- $doNext .= "ICEcoder.message('" . $t['Sorry, cannot change...'] . " \\n" . $file . "');";
- }
- $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
-};
-
-// ====================
-// CHECK FOR A FILE/DIR
-// ====================
-
-if (!isset($ftpSite) && !$error && "checkExists" === $_GET['action']) {
- // This action is called under seperate AJAX call and the responseText object stored in ICEcoder.lastFileDirCheckStatusObj
- // Nothing really done here though, we do something with the responseText
- $finalAction = "checkExists";
- $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
-};
-
-// ===================
-// JSON DATA TO RETURN
-// ===================
-
-// No $filemtime yet? Get it now!
-if (false === isset($filemtime) && !is_dir($file)) {
- $filemtime = "Linux" === $serverType ? filemtime($file) : 1000000;
-}
-if (false === isset($filemtime)) {
- $filemtime = 1000000;
-}
-
-// Set $timeStart, use 0 if not available
-$timeStart = isset($_POST["timeStart"]) ? numClean($_POST["timeStart"]) : 0;
-if ($timeStart == "") {
- $timeStart = 0;
-}
-
-if (isset($ftpSite)) {
- // Get info on dir/file now
- $ftpFileDirInfo = ftpGetFileInfo($ftpConn, ltrim($fileLoc, "/"), $fileName);
- // End the connection
- ftpEnd();
- // Then set info
- $itemAbsPath = $ftpRoot . $fileLoc . '/' . $fileName;
- $itemPath = dirname($ftpRoot.$fileLoc . '/' . $fileName);
- $itemBytes = $ftpFileDirInfo['size'];
- $itemType = (isset($ftpFileDirInfo['type']) ? ("directory" === $ftpFileDirInfo['type'] ? "dir" : "file") : "unknown");
- $itemExists = (isset($ftpFileDirInfo['type']) ? "true" : "false");
-} else {
- $itemAbsPath = $file;
- $itemPath = dirname($file);
- $itemBytes = is_dir($file) ? null : filesize($file);
- $itemType = (file_exists($file) ? (is_dir($file) ? "dir" : "file") : "unknown");
- $itemExists = (file_exists($file) ? "true" : "false");
-}
-
-echo '{
- "file": {
- "absPath": "' . $itemAbsPath . '",
- "relPath": "' . $fileLoc . '/' . $fileName . '",
- "name": "' . $fileName . '",
- "path": "' . $itemPath . '",
- "bytes": "' . $itemBytes . '",
- "modifiedDT": "' . $filemtime . '",
- "type": "' . $itemType . '",
- "exists": ' . $itemExists . '
- },
- "action": {
- "initial" : "' . xssClean($_GET['action'], "html") . '",
- "final" : "' . $finalAction . '",
- "timeStart": ' . $timeStart . ',
- "timeEnd": 0,
- "timeTaken": 0,
- "csrf": "' . xssClean($_GET['csrf'], "html") . '",
- "doNext" : "' . preg_replace('/\r|\n/', '', str_replace(' ', '', str_replace('"', '\"', $doNext))) . 'ICEcoder.switchMode();"
- },
- "status": {
- "error" : ' . ($error ? 'true' : 'false') . ',
- "errorStr" : "' . $errorStr . '",
- "errorMsg" : "' . $errorMsg . '"
- }
-}';
-
-// Set timestamp of last index to 0 to force a re-index next time we index
-requireReIndexNextTime();
diff --git a/lib/file-control.php b/lib/file-control.php
index 51559b5..9421c7b 100644
--- a/lib/file-control.php
+++ b/lib/file-control.php
@@ -1,210 +1,483 @@
-");
- };
+// If we have file(s) to work with...
+if (false === $error) {
+ $fileClass->check();
+ if ("load" === $_GET['action'] && true === $error) {
+ die("parent.parent.ICEcoder.message('" . $errorMsg . "');parent.parent.ICEcoder.serverMessage();parent.parent.ICEcoder.serverQueue(\"del\",0);");
+ }
}
+$doNext = "";
+// If we're in FTP mode, start a connection and leave open for FTP actions
+if (isset($ftpSite)) {
+ ftpStart();
+ // Show user warning if no good connection
+ if (!$ftpConn || !$ftpLogin) {
+ $doNext .= 'ICEcoder.message("Sorry, no FTP connection to ' . $ftpHost . ' for user ' . $ftpUser . '");';
+ }
+}
+
+// =============
+// LOADING FILES
+// =============
+
// If we're due to open a file...
-if ("load" === $_GET['action']) {
- echo 'action="load";';
- $lineNumber = max(isset($_REQUEST['lineNumber']) ? intval($_REQUEST['lineNumber']) : 1, 1);
- // Check this file isn't on the banned list at all
- $canOpen = true;
- for ($i = 0; $i < count($_SESSION['bannedFiles']); $i++) {
- if ("" !== str_replace("*", "", $_SESSION['bannedFiles'][$i]) && false !== strpos($file, str_replace("*", "", $_SESSION['bannedFiles'][$i]))) {
- $canOpen = false;
- }
- }
+if (!$error && "load" === $_GET['action']) {
+ echo '');
- }
- // Get our file contents and close the FTP connection
- $loadedFile = toUTF8noBOM(ftpGetContents($ftpConn, $ftpRoot . $fileLoc . "/" . $fileName, $ftpMode), false);
- ftpEnd();
- // Get local file
- } else {
- $loadedFile = toUTF8noBOM(getData($file), true);
- }
- $encoding = ini_get("default_charset");
- if ("" == $encoding) {
- $encoding = "UTF-8";
- }
- // Get content and set HTML entities on it according to encoding
- $loadedFile = htmlentities($loadedFile, ENT_COMPAT, $encoding);
- // Remove \r chars and replace \n with carriage return HTML entity char
- $loadedFile = preg_replace('/\\r/', '', $loadedFile);
- $loadedFile = preg_replace('/\\n/', '
', $loadedFile);
- echo '
+
+// ============
+// SAVING FILES
+// ============
+
+if (!$error && "save" === $_GET['action']) {
+
+ // ====================================
+ // NEW FILES AND SAVE AS XHR LOOPAROUND
+ // ====================================
+
+ if (0 < strpos($fileOrig, "[NEW]") || "saveAs" === $saveType) {
+ $finalAction = 0 < strpos($fileOrig, "[NEW]") ? "save as" : "save";
+ $fileURL = isset($file) ? $file : "";
+ $fileMDTURLPart = isset($_GET["fileMDT"]) && "undefined" !== $_GET["fileMDT"] ? "&fileMDT=" . numClean($_GET['fileMDT']) : "";
+ $fileVersionURLPart = isset($_GET["fileVersion"]) && "undefined" !== $_GET["fileVersion"] ? "&fileVersion=" . numClean($_GET['fileVersion']) : "";
+ $fileDetails = [
+ "docRoot" => $docRoot,
+ "fileLoc" => $fileLoc,
+ "fileURL" => $fileURL,
+ "fileName" => $fileName,
+ "fileMDTURLPart" => $fileMDTURLPart,
+ "fileVersionURLPart" => $fileVersionURLPart,
+ "ftpSite" => $ftpSite
+ ];
+ $doNext .= $fileClass->handleSaveLooparound($fileDetails, $finalAction, $doNext, $t);
+
+ // ===================
+ // FILE CONTENT SAVING
+ // ===================
+
+ } elseif (isset($_POST['changes']) || isset($_POST['contents'])) {
+ $finalAction = isset($_POST["newFileName"]) ? "save as" : "save";
+
+ // =================
+ // FILE IS WRITEABLE
+ // =================
+
+ if (!$demoMode && (isset($ftpSite) || (file_exists($file) && is_writable($file)) || isset($_POST['newFileName']) && "" != $_POST['newFileName'])) {
+
+ $filemtime = !isset($ftpSite) && "Linux" === $serverType ? filemtime($file) : "1000000";
+
+ // =======================
+ // MDT'S MATCH, WRITE FILE
+ // =======================
+
+ if (!(isset($_GET['fileMDT'])) || $filemtime == $_GET['fileMDT']) {
+
+ // FTP Saving
+ if (isset($ftpSite)) {
+ $ftpClass->writeFile();
+ // Local saving
+ } else {
+ $fileClass->writeFile();
+ }
+
+ // Save a version controlled backup source of the file
+ if ($ICEcoder["backupsKept"]) {
+ $backupClass->makeBackup($fileLoc, $fileName, $contents);
+ }
+
+ $doNext .= $fileClass->updateUI($doNext);
+ $doNext .= $fileClass->handleMarkdown($doNext);
+ $doNext .= $fileClass->handleDiffPane($doNext);
+ $doNext .= $fileClass->finaliseSave($doNext);
+
+ include_once "on-file-save.php";
+ // Run any extra processes
+ $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
+ $doNext = $extraProcesses->onFileSave($doNext);
+
+ // ======================================================
+ // MDT'S DON'T MATCH, OFFER TO LOAD FILE & SHOW DIFF VIEW
+ // ======================================================
+
+ } else {
+ $fileClass->loadAndShowDiff();
+ }
+
+ // ===================
+ // FILE IS UNWRITEABLE
+ // ===================
+
+ } else {
+ $finalAction = "nothing";
+ $doNext .= "ICEcoder.message('" . $t['Sorry, cannot save'] . "\\\\n" . $file . "');";
+ }
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+ }
+};
+
+// ==========
+// NEW FOLDER
+// ==========
+
+if (!$error && "newFolder" === $_GET['action']) {
+ if (!$demoMode && (isset($ftpSite) || is_writable($docRoot.$fileLoc))) {
+ // FTP
+ if (isset($ftpSite)) {
+ $ftpFilepath = ltrim($fileLoc . "/" . $fileName, "/");
+ if (!ftpMkDir($ftpConn, octdec($ICEcoder['newDirPerms']), $ftpFilepath)) {
+ $doNext .= 'ICEcoder.message("Sorry, could not create dir '.$ftpFilepath.' at ' . $ftpHost . '");';
+ } else {
+ $fileClass->updateFileManager('add', $fileLoc, $fileName, '', '', '', 'folder');
+ }
+ // Local
+ } else {
+ mkdir($file, octdec($ICEcoder['newDirPerms']));
+ $fileClass->updateFileManager('add', $fileLoc, $fileName, '', '', '', 'folder');
+ }
+ $finalAction = "newFolder";
+ // Run any extra processes
+ $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
+ $doNext = $extraProcesses->onDirNew($doNext);
+ } else {
+ $doNext .= "ICEcoder.message('" . $t['Sorry, cannot create...'] . "\\\\n" . $fileLoc . "');";
+ $finalAction = "nothing";
+ }
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+};
+
+// ================
+// MOVE FILE/FOLDER
+// ================
+
+if (!$error && "move" === $_GET['action']) {
+ if (isset($ftpSite)) {
+ $srcDir = ltrim(str_replace("|", "/", $_GET['oldFileName']), "/");
+ $tgtDir = ltrim($fileLoc . "/" . $fileName, "/");
+ } else {
+ $srcDir = $docRoot . $iceRoot . str_replace("|", "/", $_GET['oldFileName']);
+ $tgtDir = $docRoot . $fileLoc . "/" . $fileName;
+ }
+ if ($srcDir != $tgtDir && $fileLoc != "") {
+ if (!$demoMode && (isset($ftpSite) || is_writable($srcDir))) {
+ // FTP
+ if (isset($ftpSite)) {
+ if (!ftpRename($ftpConn, $srcDir, $tgtDir)) {
+ $doNext .= 'ICEcoder.message("Sorry, could not rename ' . $srcDir . ' to ' . $tgtDir . '");';
+ } else {
+ $ftpFileDirInfo = ftpGetFileInfo($ftpConn, ltrim($fileLoc, "/"), $fileName);
+ $fileOrFolder = "directory" === $ftpFileDirInfo['type'] ? "folder" : "file";
+ $fileClass->updateFileManager('move', $fileLoc, $fileName, '', str_replace($iceRoot, "", str_replace("|", "/", $_GET['oldFileName'])), '', $fileOrFolder);
+ }
+ // Local
+ } else {
+ if(rename($srcDir, $tgtDir)) {
+ // Is a dir or file (needed to create new item in file manager)
+ $fileOrFolder = is_dir($docRoot . $fileLoc . "/" . $fileName) ? "folder" : "file";
+ $fileClass->updateFileManager('move', $fileLoc, $fileName, '', str_replace($iceRoot, "", str_replace("|", "/", $_GET['oldFileName'])), '', $fileOrFolder);
+ }
+ }
+ $finalAction = "move";
+ // Run any extra processes
+ $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
+ $doNext = $extraProcesses->onFileDirMove($doNext);
+ } else {
+ $doNext .= "ICEcoder.message('" . $t['Sorry, cannot move'] . "\\\\n" . str_replace("|", "/", $_GET['oldFileName']) . "\\\\n\\\\n" . $t['Maybe public write...'] . "');";
+ $finalAction = "nothing";
+ }
+ } else {
+ $doNext .= "";
+ $finalAction = "nothing";
+ }
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+};
+
+// ==================
+// RENAME FILE/FOLDER
+// ==================
+
+if (!$error && "rename" === $_GET['action']) {
+ if (!$demoMode && (isset($ftpSite) || is_writable($docRoot.$iceRoot.str_replace("|", "/", $_GET['oldFileName'])))) {
+ // FTP
+ if (isset($ftpSite)) {
+ $ftpFilepath = ltrim($fileLoc . "/" . $fileName, "/");
+ if (!ftpRename($ftpConn, ltrim($_GET['oldFileName'], "/"), $ftpFilepath)) {
+ $doNext .= 'ICEcoder.message("Sorry, could not rename ' . ltrim($_GET['oldFileName'], "/") . ' to ' . $ftpFilepath . '");';
+ } else {
+ $fileClass->updateFileManager('rename', $fileLoc, $fileName, '', str_replace($iceRoot, "", $_GET['oldFileName']), '', '');
+ }
+ // Local
+ } else {
+ rename($docRoot.$iceRoot.str_replace("|", "/", $_GET['oldFileName']), $docRoot . $fileLoc . "/" . $fileName);
+ $fileClass->updateFileManager('rename', $fileLoc, $fileName, '', str_replace($iceRoot, "", $_GET['oldFileName']), '', '');
+ }
+
+ $finalAction = "rename";
+ // Run any extra processes
+ $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
+ $doNext = $extraProcesses->onFileDirRename($doNext);
+ } else {
+ $doNext .= "ICEcoder.message('".$t['Sorry, cannot rename'] . "\\\\n" . $_GET['oldFileName'] . "\\\\n\\\\n" . $t['Maybe public write...'] . "');";
+ $finalAction = "nothing";
+ }
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+};
+
+// =================
+// PASTE FILE/FOLDER
+// =================
+
+if (!isset($ftpSite) && !$error && "paste" === $_GET['action']) {
+ $source = $file;
+ $dest = str_replace("//", "/", $docRoot . $iceRoot . str_replace("|", "/", $_GET['location']) . "/" . basename($source));
+ if (!$demoMode && is_writable(dirname($dest))) {
+
+ $fileOrFolder = $fileClass->paste();
+
+ // Reload file manager
+ $doNext .= 'ICEcoder.updateFileManagerList(\'add\', \'' . str_replace("|", "/", $_GET['location']) . '\', \'' . basename($dest) . '\', false, false, false, \'' . $fileOrFolder . '\');';
+ $finalAction = "pasteFile";
+ // Run any extra processes
+ $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
+ $doNext = $extraProcesses->onFileDirPaste($doNext, $dest);
+ } else {
+ $doNext .= "ICEcoder.message('" . $t['Sorry, cannot copy'] . " \\\\n" . str_replace($docRoot, "", $source) . "\\\\n " . $t['into'] . " \\\\n" . str_replace($docRoot, "", $dest) . "');";
+ $finalAction = "nothing";
+ }
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+};
+
+// ==============
+// UPLOAD FILE(S)
+// ==============
+
+if (!isset($ftpSite) && !$error && "upload" === $_GET['action']) {
+ if (!$demoMode) {
+
+ if ($_FILES['filesInput']){
+ $uploads = $fileClass->getUploadedDetails($_FILES['filesInput']);
+ $finalAction = $fileClass->upload($uploads);
+ }
+ // Run any extra processes
+ $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
+ $doNext = $extraProcesses->onFileUpload($doNext, $uploads);
+ } else {
+ $doNext .= "parent.parent.ICEcoder.message('" . $t['Sorry, cannot upload...'] . "');";
+ $finalAction = "nothing";
+ }
+
+ $doNext .= "parent.parent.ICEcoder.hideFileMenu(); parent.parent.document.getElementById('fileInput').value = ''; parent.parent.ICEcoder.showHide('hide', parent.parent.document.getElementById('loadingMask'));";
+
+ // Upload is not handled by XHR methods, but form post, so we need to manually trigger $doNext in a script tag
+ echo "";
+};
+
+// ========================
+// DELETE FILE(S)/FOLDER(S)
+// ========================
+
+if (!$error && "delete" === $_GET['action']) {
+ $filesArray = explode(";", $file); // May contain more than one file here
+ // FTP
+ if (isset($ftpSite)) {
+ if (1 === count($filesArray)) {
+ $ftpFileDirInfo = ftpGetFileInfo($ftpConn, ltrim($fileLoc, "/"), $fileName);
+ $itemType = "directory" === $ftpFileDirInfo['type'] ? "dir" : "file";
+ $itemPath = ltrim($fileLoc . "/" . $fileName, "/");
+ if (!$demoMode && ftpDelete($ftpConn, $itemType, $itemPath)) {
+ if ($fileLoc=="" || "\\" === $fileLoc) {
+ $fileLoc = "/";
+ };
+ // Reload file manager
+ $doNext .= 'ICEcoder.selectedFiles = []; ICEcoder.updateFileManagerList(\'delete\', \'' . $fileLoc . '\', \'' . $fileName . '\');';
+ $finalAction = "delete";
+ // Run any extra processes
+ $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
+ $doNext = $extraProcesses->onFileDirDelete($doNext);
+ } else {
+ $doNext .= "ICEcoder.message('" . $t['Sorry, cannot delete'] . "\\\\n" . $fileLoc . "/" . $fileName . "');";
+ $finalAction = "nothing";
+ }
+ } else {
+ $doNext .= "ICEcoder.message('" . $t['Sorry, cannot delete more...'] . "');";
+ $finalAction = "nothing";
+ }
+ // Local
+ } else {
+ $fileClass->delete();
+ }
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+};
+
+// ======================
+// REPLACE TEXT IN A FILE
+// ======================
+
+if (!isset($ftpSite) && !$error && "replaceText" === $_GET['action']) {
+ if (!$demoMode && is_writable($file)) {
+ $loadedFile = toUTF8noBOM(getData($file), true);
+ $newContent = str_replace($_GET['find'], $_GET['replace'], $loadedFile);
+ $fh = fopen($file, 'w') or die($t['Sorry, cannot save']);
+ fwrite($fh, $newContent);
+ fclose($fh);
+ $finalAction = "replaceText";
+
+ // Run any extra processes
+ $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
+ $doNext = $extraProcesses->onFileReplaceText($doNext, $_GET['fileRef']);
+
+ } else {
+ $doNext .= "ICEcoder.message('" . $t['Sorry, cannot replace...'] . "\\\\n" . $file . "');";
+ $finalAction = "nothing";
+ }
+
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+};
+
+// ==========================
+// GET CONTENTS OF REMOTE URL
+// ==========================
+
+if (!isset($ftpSite) && !$error && "getRemoteFile" === $_GET['action']) {
+ $lineNumber = max(isset($_REQUEST['lineNumber']) ? intval($_REQUEST['lineNumber']) : 1, 1);
+
+ if ($remoteFile = toUTF8noBOM(getData($file, 'curl'), true)) {
+ // Get URL contents
+ $url = new URL($remoteFile);
+ $doNext = $url->load($doNext, $ICEcoder["lineEnding"], $lineNumber);
+ $finalAction = "getRemoteFile";
+
+ // Run any extra processes
+ $extraProcesses = new ExtraProcesses($fileLoc);
+ $doNext = $extraProcesses->onGetRemoteFile($doNext);
+
+ } else {
+ $finalAction = "nothing";
+ $doNext .= 'ICEcoder.message(\'' . $t['Sorry, could not...'] . ' '.$file . '\');';
+ }
+
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+};
+
+// =======================
+// CHANGING FILE/DIR PERMS
+// =======================
+
+if (!$error && "perms" === $_GET['action']) {
+ if (!$demoMode && (isset($ftpSite) || is_writable($file))) {
+ // FTP
+ if (isset($ftpSite)) {
+ $ftpFilepath = ltrim($fileLoc . "/" . $fileName, "/");
+ if (!ftpPerms($ftpConn, octdec(numClean($_GET['perms'])), $ftpFilepath)) {
+ $doNext .= 'ICEcoder.message("Sorry, could not set perms on ' . $ftpFilepath . ' at ' . $ftpHost . '");';
+ } else {
+ $fileClass->updateFileManager('chmod', $fileLoc, $fileName, numClean($_GET['perms']), '', '', '');
+ }
+ // Local
+ } else {
+ chmod($file, octdec(numClean($_GET['perms'])));
+ $fileClass->updateFileManager('chmod', $fileLoc, $fileName, numClean($_GET['perms']), '', '', '');
+ }
+ $finalAction = "perms";
+ // Run any custom processes
+ $extraProcesses = new ExtraProcesses($fileLoc, $fileName);
+ $doNext = $extraProcesses->onFileDirPerms($doNext, $_GET['perms']);
+ } else {
+ $finalAction = "nothing";
+ $doNext .= "ICEcoder.message('" . $t['Sorry, cannot change...'] . " \\n" . $file . "');";
+ }
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+};
+
+// ====================
+// CHECK FOR A FILE/DIR
+// ====================
+
+if (!isset($ftpSite) && !$error && "checkExists" === $_GET['action']) {
+ // This action is called under seperate AJAX call and the responseText object stored in ICEcoder.lastFileDirCheckStatusObj
+ // Nothing really done here though, we do something with the responseText
+ $finalAction = "checkExists";
+ $doNext .= 'ICEcoder.serverMessage(); ICEcoder.serverQueue("del", 0);';
+};
+
+// ===================
+// JSON DATA TO RETURN
+// ===================
+
+// No $filemtime yet? Get it now!
+if (false === isset($filemtime) && !is_dir($file)) {
+ $filemtime = "Linux" === $serverType ? filemtime($file) : 1000000;
+}
+if (false === isset($filemtime)) {
+ $filemtime = 1000000;
+}
+
+// Set $timeStart, use 0 if not available
+$timeStart = isset($_POST["timeStart"]) ? numClean($_POST["timeStart"]) : 0;
+if ($timeStart == "") {
+ $timeStart = 0;
+}
+
+echo $fileClass->returnJSON();
+
+// Set timestamp of last index to 0 to force a re-index next time we index
+requireReIndexNextTime();