0||$saveType=="saveAs") { $finalAction = strpos($fileOrig,"[NEW]")>0 ? "save as" : "save"; $fileURL = isset($file) ? $file : ""; $fileMDTURLPart = isset($_GET["fileMDT"]) && $_GET["fileMDT"]!="undefined" ? "&fileMDT=".numClean($_GET['fileMDT']) : ""; $fileVersionURLPart = isset($_GET["fileVersion"]) && $_GET["fileVersion"]!="undefined" ? "&fileVersion=".numClean($_GET['fileVersion']) : ""; $doNext .= ' top.ICEcoder.serverMessage(); fileLoc = "'.$fileLoc.'"; overwriteOK = false; noConflictSave = false; newFileName = top.ICEcoder.getInput("'.$t['Enter filename to...'].' "+(fileLoc!="" ? fileLoc : "/"),""); if (newFileName) { if (newFileName.substr(0,1)!="/") {newFileName = "/" + newFileName}; newFileName = fileLoc + newFileName; /* Check if file/dir exists */ top.ICEcoder.lastFileDirCheckStatusObj = false; top.ICEcoder.checkExists(newFileName); var thisInt = setInterval(function() { if (top.ICEcoder.lastFileDirCheckStatusObj != false) { clearInterval(thisInt); if (top.ICEcoder.lastFileDirCheckStatusObj.file && top.ICEcoder.lastFileDirCheckStatusObj.file.exists) { overwriteOK = top.ICEcoder.ask("'.$t['That file exists...'].'"); } else { noConflictSave = true; }; /* Saving under conditions: Confirmation of overwrite or there is no filename conflict, it is a new file, in either case we can save */ if (overwriteOK || noConflictSave) { newFileName = "'.(isset($ftpSite) ? "" : $docRoot).'" + newFileName; saveURL = "lib/file-control-xhr.php?action=save'.$fileMDTURLPart.$fileVersionURLPart.'&csrf='.$_GET["csrf"].'"; var xhr = top.ICEcoder.xhrObj(); xhr.onreadystatechange=function() { if (xhr.readyState==4 && xhr.status==200) { /* console.log(xhr.responseText); */ var statusObj = JSON.parse(xhr.responseText); /* Set the actions end time and time taken in JSON object */ statusObj.action.timeEnd = new Date().getTime(); statusObj.action.timeTaken = statusObj.action.timeEnd - statusObj.action.timeStart; /* console.log(statusObj); */ if (statusObj.status.error) { top.ICEcoder.message(statusObj.status.errorMsg); } else { eval(statusObj.action.doNext); } } }; /* console.log(\'Calling \'+saveURL+\' via XHR\'); */ xhr.open("POST",saveURL,true); xhr.setRequestHeader(\'Content-type\', \'application/x-www-form-urlencoded\'); xhr.send(\'timeStart='.$_POST["timeStart"].'&file='.$fileURL.'&newFileName=\'+newFileName+\'&contents=\'+top.ICEcoder.saveAsContent); top.ICEcoder.serverMessage("'.$t['Saving'].'
" + "'.($finalAction == "Save" ? "newFileName" : "'".$fileName."'").'"); } } },10); }; /* UI dialog cancelling and saving contents for save as looparound */ if (!newFileName || newFileName && !overwriteOK) { top.ICEcoder.saveAsContent = top.document.getElementById(\'saveTemp1\').value; top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0); }'; // =================== // FILE CONTENT SAVING // =================== } elseif (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) && $serverType=="Linux" ? filemtime($file) : "1000000"; // ======================= // MDT'S MATCH, WRITE FILE // ======================= if (!(isset($_GET['fileMDT']))||$filemtime==$_GET['fileMDT']) { // FTP Saving if (isset($ftpSite)) { // Write our file contents $ftpFilepath = ltrim($fileLoc."/".$fileName,"/"); // replace \r\n (Windows), \r (old Mac) and \n (Linux) line endings with whatever we chose to be lineEnding $contents = $_POST['contents']; $contents = str_replace("\r\n", $ICEcoder["lineEnding"], $contents); $contents = str_replace("\r", $ICEcoder["lineEnding"], $contents); $contents = str_replace("\n", $ICEcoder["lineEnding"], $contents); if (!ftpWriteFile($ftpConn, $ftpFilepath, $contents, $ftpMode)) { $doNext .= 'top.ICEcoder.message("Sorry, could not write '.$ftpFilepath.' at '.$ftpHost.'");'; } $doNext .= 'top.ICEcoder.openFileMDTs[top.ICEcoder.selectedTab-1]="'.$filemtime.'";'; $doNext .= '(function() {var x=top.ICEcoder.openFileVersions; var y=top.ICEcoder.selectedTab-1; x[y] = "undefined" != typeof x[y] ? x[y]+1 : 1})();top.ICEcoder.updateVersionsDisplay();'; // Local saving } else { // Newly created files have the perms set too $setPerms = (!file_exists($file)) ? true : false; // get old file contents, if file exists, 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)?file_get_contents($file):''; $unixNewLines = preg_match_all('/[^\r][\n]/u', $oldContents); $windowsNewLines = preg_match_all('/[\r][\n]/u', $oldContents); $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 = $_POST['contents']; $contents = str_replace("\r\n", $ICEcoder["lineEnding"], $contents); $contents = str_replace("\r", $ICEcoder["lineEnding"], $contents); $contents = str_replace("\n", $ICEcoder["lineEnding"], $contents); if (($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); } } // 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 = $serverType=="Linux" ? filemtime($file) : "1000000"; $doNext .= 'top.ICEcoder.openFileMDTs[top.ICEcoder.selectedTab-1]="'.$filemtime.'";'; $doNext .= '(function() {var x=top.ICEcoder.openFileVersions; var y=top.ICEcoder.selectedTab-1; x[y] = "undefined" != typeof x[y] ? x[y]+1 : 1})();top.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__))."/../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","",$loadedFile)))).'"; var refreshFile = top.ICEcoder.ask("'.$t['Sorry, this file...'].'\\\n'.$file.'\\\n\\\n'.$t['Reload this file...'].'"); if (refreshFile) { var cM = top.ICEcoder.getcMInstance(); var thisTab = top.ICEcoder.selectedTab; var userVersionFile = cM.getValue(); /* Revert back to original */ cM.setValue(loadedFile.value); top.ICEcoder.savedPoints[thisTab-1] = cM.changeGeneration(); top.ICEcoder.openFileMDTs[top.ICEcoder.selectedTab-1] = "'.$filemtime.'"; top.ICEcoder.openFileVersions[top.ICEcoder.selectedTab-1] = "'.$fileCountInfo['count'].'"; cM.clearHistory(); /* Now for the new version in the diff pane */ top.ICEcoder.setSplitPane(\'on\'); var cMdiff = top.ICEcoder.getcMdiffInstance(); cMdiff.setValue(userVersionFile); };'; $finalAction = "nothing"; } // =================== // FILE IS UNWRITEABLE // =================== } else { $finalAction = "nothing"; $doNext .= "top.ICEcoder.message('".$t['Sorry, cannot save']."\\\\n".$file."');"; } $doNext .= 'top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);'; } }; // ========== // NEW FOLDER // ========== if (!$error && $_GET['action']=="newFolder") { if (!$demoMode && ($ftpSite || is_writable($docRoot.$fileLoc))) { $updateFM = false; // FTP if (isset($ftpSite)) { $ftpFilepath = ltrim($fileLoc."/".$fileName,"/"); if (!ftpMkDir($ftpConn, octdec($ICEcoder['newDirPerms']), $ftpFilepath)) { $doNext .= 'top.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 .= 'top.ICEcoder.selectedFiles=[];top.ICEcoder.updateFileManagerList(\'add\',\''.$fileLoc.'\',\''.$fileName.'\',false,false,false,\'folder\');'; } $finalAction = "newFolder"; // Run our custom processes include_once("../processes/on-new-dir.php"); } else { $doNext .= "top.ICEcoder.message('".$t['Sorry, cannot create...']."\\\\n".$fileLoc."');"; $finalAction = "nothing"; } $doNext .= 'top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);'; }; // ================ // MOVE FILE/FOLDER // ================ if (!$error && $_GET['action']=="move") { if (isset($ftpSite)) { $srcDir = ltrim(str_replace("|","/",strClean($_GET['oldFileName'])),"/"); $tgtDir = ltrim($fileLoc."/".$fileName,"/"); } else { $srcDir = $docRoot.$iceRoot.str_replace("|","/",strClean($_GET['oldFileName'])); $tgtDir = $docRoot.$fileLoc."/".$fileName; } if ($srcDir != $tgtDir && $fileLoc != "") { if (!$demoMode && ($ftpSite || is_writable($srcDir))) { $updateFM = false; // FTP if (isset($ftpSite)) { if (!ftpRename($ftpConn, $srcDir, $tgtDir)) { $doNext .= 'top.ICEcoder.message("Sorry, could not rename '.$srcDir.' to '.$tgtDir.'");'; } else { $ftpFileDirInfo = ftpGetFileInfo($ftpConn, ltrim($fileLoc,"/"), $fileName); $fileOrFolder = $ftpFileDirInfo['type'] == "directory" ? "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 .= 'top.ICEcoder.selectedFiles=[];top.ICEcoder.updateFileManagerList(\'move\',\''.$fileLoc.'\',\''.$fileName.'\',\'\',\''.str_replace($iceRoot,"",strClean(str_replace("|","/",$_GET['oldFileName']))).'\',false,$fileOrFolder);'; } $finalAction = "move"; // Run our custom processes include_once("../processes/on-file-dir-move.php"); } else { $doNext .= "top.ICEcoder.message('".$t['Sorry, cannot move']."\\\\n".str_replace("|","/",strClean($_GET['oldFileName']))."\\\\n\\\\n".$t['Maybe public write...']."');"; $finalAction = "nothing"; } } else { $doNext .= ""; $finalAction = "nothing"; } $doNext .= 'top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);'; }; // ================== // RENAME FILE/FOLDER // ================== if (!$error && $_GET['action']=="rename") { if (!$demoMode && ($ftpSite || is_writable($docRoot.$iceRoot.str_replace("|","/",strClean($_GET['oldFileName']))))) { $updateFM = false; // FTP if (isset($ftpSite)) { $ftpFilepath = ltrim($fileLoc."/".$fileName,"/"); if (!ftpRename($ftpConn, ltrim(strClean($_GET['oldFileName']),"/"), $ftpFilepath)) { $doNext .= 'top.ICEcoder.message("Sorry, could not rename '.ltrim(strClean($_GET['oldFileName']),"/").' to '.$ftpFilepath.'");'; } else { $updateFM = true; } // Local } else { rename($docRoot.$iceRoot.str_replace("|","/",strClean($_GET['oldFileName'])),$docRoot.$fileLoc."/".$fileName); $updateFM = true; } // Update file manager on success if ($updateFM) { $doNext .= 'top.ICEcoder.selectedFiles=[];top.ICEcoder.updateFileManagerList(\'rename\',\''.$fileLoc.'\',\''.$fileName.'\',\'\',\''.str_replace($iceRoot,"",strClean($_GET['oldFileName'])).'\');'; } $finalAction = "rename"; // Run our custom processes include_once("../processes/on-file-dir-rename.php"); } else { $doNext .= "top.ICEcoder.message('".$t['Sorry, cannot rename']."\\\\n".strClean($_GET['oldFileName'])."\\\\n\\\\n".$t['Maybe public write...']."');"; $finalAction = "nothing"; } $doNext .= 'top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);'; }; // ================= // PASTE FILE/FOLDER // ================= if (!isset($ftpSite) && !$error && $_GET['action']=="paste") { $source = $file; $dest = str_replace("//","/",$docRoot.$iceRoot.strClean(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 .= 'top.ICEcoder.updateFileManagerList(\'add\',\''.strClean(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 .= "top.ICEcoder.message('".$t['Sorry, cannot copy']." \\\\n".str_replace($docRoot,"",$source)."\\\\n ".$t['into']." \\\\n".str_replace($docRoot,"",$dest)."');"; $finalAction = "nothing"; } $doNext .= 'top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);'; }; // ============== // UPLOAD FILE(S) // ============== if (!isset($ftpSite) && !$error && $_GET['action']=="upload") { if (!$demoMode) { class fileUploader { public function __construct($uploads) { global $docRoot,$iceRoot,$ICEcoder,$doNext; $uploadDir=$docRoot.$iceRoot.str_replace("..","",str_replace("|","/",strClean($_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 .= 'top.ICEcoder.updateFileManagerList(\'add\',top.ICEcoder.selectedFiles[top.ICEcoder.selectedFiles.length-1].replace(/\|/g,\'/\'),\''.str_replace("'","\'",$fileName).'\',false,false,true,\'file\'); top.ICEcoder.serverMessage("'.$t['Uploaded file(s) OK'].'");setTimeout(function(){top.ICEcoder.serverMessage();},2000);'; $finalAction = "upload"; } else { $doNext .= "top.ICEcoder.message('".$t['Sorry, cannot upload']." \\\\n".$fileName."\\\\n ".$t['into']." \\\\n'+top.ICEcoder.selectedFiles[top.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=$fileArr['name'][$keyee]; $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 .= "top.ICEcoder.message('".$t['Sorry, cannot upload...']."');"; $finalAction = "nothing"; } $doNext .= "top.ICEcoder.hideFileMenu();top.document.getElementById('fileInput').value='';top.ICEcoder.showHide('hide',top.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 && $_GET['action']=="delete") { $filesArray = explode(";",$file); // May contain more than one file here // FTP if (isset($ftpSite)) { if (count($filesArray) == 1) { $ftpFileDirInfo = ftpGetFileInfo($ftpConn, ltrim($fileLoc,"/"), $fileName); $itemType = $ftpFileDirInfo['type'] == "directory" ? "dir" : "file"; $itemPath = ltrim($fileLoc."/".$fileName,"/"); if (!$demoMode && ftpDelete($ftpConn,$itemType,$itemPath)) { if ($fileLoc=="" || $fileLoc=="\\") {$fileLoc="/";}; // Reload file manager $doNext .= 'top.ICEcoder.selectedFiles=[];top.ICEcoder.updateFileManagerList(\'delete\',\''.$fileLoc.'\',\''.$fileName.'\');'; $finalAction = "delete"; // Run our custom processes include_once("../processes/on-file-dir-delete.php"); } else { $doNext .= "top.ICEcoder.message('".$t['Sorry, cannot delete']."\\\\n".$fileLoc."/".$fileName."');"; $finalAction = "nothing"; } } else { $doNext .= "top.ICEcoder.message('".$t['Sorry, cannot delete more...']."');"; $finalAction = "nothing"; } // Local } else { for ($i=0;$i