' . $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);'; // Run our custom processes include_once "../processes/on-file-save.php"; // ====================================================== // 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 our custom processes include_once "../processes/on-new-dir.php"; } 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 our custom processes include_once "../processes/on-file-dir-move.php"; } 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 our custom processes include_once "../processes/on-file-dir-rename.php"; } 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 our custom processes include_once "../processes/on-file-dir-paste.php"; } 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 our custom processes include_once "../processes/on-file-upload.php"; } 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 our custom processes include_once "../processes/on-file-dir-delete.php"; } 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 our custom processes include_once "../processes/on-file-dir-delete.php"; } 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 our custom processes include_once "../processes/on-file-replace-text.php"; } 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 our custom processes include_once "../processes/on-get-remote-file.php"; } 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 our custom processes include_once "../processes/on-file-dir-perms.php"; } 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();