From 8a8ee94c633363af2cecae26710e9f5e984078ec Mon Sep 17 00:00:00 2001 From: Ryan Boren Date: Wed, 20 Feb 2008 00:12:48 +0000 Subject: [PATCH] Set eol-style to native git-svn-id: https://develop.svn.wordpress.org/trunk@6919 602fd350-edb4-49c9-b593-d223f7449a82 --- wp-admin/includes/class-ftp.php | 1118 ++++++++--------- .../includes/class-wp-filesystem-direct.php | 636 +++++----- .../includes/class-wp-filesystem-ftpext.php | 758 +++++------ .../class-wp-filesystem-ftpsockets.php | 710 +++++------ 4 files changed, 1611 insertions(+), 1611 deletions(-) diff --git a/wp-admin/includes/class-ftp.php b/wp-admin/includes/class-ftp.php index 5240816144..cd1c584783 100644 --- a/wp-admin/includes/class-ftp.php +++ b/wp-admin/includes/class-ftp.php @@ -1,560 +1,560 @@ -_resetError(); - - $err_no = 0; - $err_msg = ""; - $this->controlSocket = @fsockopen($host, $port, $err_no, $err_msg, $timeout) or $this->_setError(-1,"fsockopen failed"); - if ($err_no<>0) $this->setError($err_no,$err_msg); - - if ($this->_isError()) return false; - - @socket_set_timeout($this->controlSocket,$timeout) or $this->_setError(-1,"socket_set_timeout failed"); - if ($this->_isError()) return false; - - $this->_waitForResult(); - if ($this->_isError()) return false; - - return $this->getLastResult() == FTP_SERVICE_READY; - } - - function isConnected() { - return $this->controlSocket != NULL; - } - - function disconnect() { - if (!$this->isConnected()) return; - @fclose($this->controlSocket); - } - - function close() { //Closes an FTP connection - $this->disconnect(); - } - - function login($user, $pass) { //Logs in to an FTP connection - $this->_resetError(); - - $this->_printCommand("USER $user"); - if ($this->_isError()) return false; - - $this->_waitForResult(); - if ($this->_isError()) return false; - - if ($this->getLastResult() == FTP_PASSWORD_NEEDED){ - $this->_printCommand("PASS $pass"); - if ($this->_isError()) return FALSE; - - $this->_waitForResult(); - if ($this->_isError()) return FALSE; - } - - $result = $this->getLastResult() == FTP_USER_LOGGED_IN; - return $result; - } - - function cdup() { //Changes to the parent directory - $this->_resetError(); - - $this->_printCommand("CDUP"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); - } - - function cwd($path) { - $this->_resetError(); - - $this->_printCommand("CWD $path"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); - } - - function cd($path) { - return $this->cwd($path); - } - - function chdir($path) { //Changes directories on a FTP server - return $this->cwd($path); - } - - function chmod($mode,$filename) { //Set permissions on a file via FTP - return $this->site("CHMOD $mode $filename"); - } - - function delete($filename) { //Deletes a file on the FTP server - $this->_resetError(); - - $this->_printCommand("DELE $filename"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); - } - - function exec($cmd) { //Requests execution of a program on the FTP server - return $this->site("EXEC $cmd"); - } - - function fget($fp,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server and saves to an open file - $this->_resetError(); - - $type = "I"; - if ($mode==FTP_ASCII) $type = "A"; - - $this->_printCommand("TYPE $type"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - - $result = $this->_download("RETR $remote"); - if ($result) { - fwrite($fp,$result); - } - return $result; - } - - function fput($remote,$resource,$mode=FTP_BINARY,$startpos=0) { //Uploads from an open file to the FTP server - $this->_resetError(); - - $type = "I"; - if ($mode==FTP_ASCII) $type = "A"; - - $this->_printCommand("TYPE $type"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - - if ($startpos>0) fseek($resource,$startpos); - $result = $this->_uploadResource("STOR $remote",$resource); - return $result; - } - - function get_option($option) { //Retrieves various runtime behaviours of the current FTP stream - $this->_resetError(); - - switch ($option) { - case "FTP_TIMEOUT_SEC" : return FTP_TIMEOUT; - case "PHP_FTP_OPT_AUTOSEEK" : return FALSE; - } - setError(-1,"Unknown option: $option"); - return false; - } - - function get($locale,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server - if (!($fp = @fopen($locale,"wb"))) return FALSE; - $result = $this->fget($fp,$remote,$mode,$resumepos); - @fclose($fp); - if (!$result) @unlink($locale); - return $result; - } - function mdtm($name) { //Returns the last modified time of the given file - $this->_resetError(); - - $this->_printCommand("MDTM $name"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - if ($lr!=FTP_FILE_STATUS) return FALSE; - $subject = trim(substr($this->lastLine,4)); - $lucifer = array(); - if (preg_match("/([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])/",$subject,$lucifer)) - return mktime($lucifer[4],$lucifer[5],$lucifer[6],$lucifer[2],$lucifer[3],$lucifer[1],0); - return FALSE; - } - - function mkdir($name) { //Creates a directory - $this->_resetError(); - - $this->_printCommand("MKD $name"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - return ($lr==FTP_PATHNAME || $lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); - } - - function nb_continue() { //Continues retrieving/sending a file (non-blocking) - $this->_resetError(); - // todo - } - - function nb_fget() { //Retrieves a file from the FTP server and writes it to an open file (non-blocking) - $this->_resetError(); - // todo - } - - function nb_fput() { //Stores a file from an open file to the FTP server (non-blocking) - $this->_resetError(); - // todo - } - - function nb_get() { //Retrieves a file from the FTP server and writes it to a local file (non-blocking) - $this->_resetError(); - // todo - } - - function nb_put() { //Stores a file on the FTP server (non-blocking) - $this->_resetError(); - // todo - } - - function nlist($remote_filespec="") { //Returns a list of files in the given directory - $this->_resetError(); - $result = $this->_download(trim("NLST $remote_filespec")); - return ($result !== FALSE) ? explode("\n",str_replace("\r","",trim($result))) : $result; - } - - function pasv($pasv) { //Turns passive mode on or off - if (!$pasv) { - $this->_setError("Active (PORT) mode is not supported"); - return false; - } - return true; - } - - function put($remote,$local,$mode=FTP_BINARY,$startpos=0) { //Uploads a file to the FTP server - if (!($fp = @fopen($local,"rb"))) return FALSE; - $result = $this->fput($remote,$fp,$mode,$startpos); - @fclose($fp); - return $result; - } - - function pwd() { //Returns the current directory name - $this->_resetError(); - - $this->_printCommand("PWD"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - if ($lr!=FTP_PATHNAME) return FALSE; - $subject = trim(substr($this->lastLine,4)); - $lucifer = array(); - if (preg_match("/\"(.*)\"/",$subject,$lucifer)) return $lucifer[1]; - return FALSE; - } - - function quit() { //Alias of close - $this->close(); - } - - function raw($cmd) { //Sends an arbitrary command to an FTP server - $this->_resetError(); - - $this->_printCommand($cmd); - $this->_waitForResult(); - $this->getLastResult(); - return array($this->lastLine); - } - - function rawlist($remote_filespec="") { //Returns a detailed list of files in the given directory - $this->_resetError(); - $result = $this->_download(trim("LIST $remote_filespec")); - return ($result !== FALSE) ? explode("\n",str_replace("\r","",trim($result))) : $result; - } - - function ls($remote_filespec="") { //Returns a parsed rawlist in an assoc array - $a = $this->rawlist($remote_filespec); - if (!$a) return $a; - $systype = $this->systype(); - $is_windows = stristr($systype,"WIN")!==FALSE; - $b = array(); - while (list($i,$line) = each($a)) { - if ($is_windows && preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|) +(.+)/",$line,$lucifer)) { - $b[$i] = array(); - if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix - $b[$i]['isdir'] = ($lucifer[7]==""); - $b[$i]['size'] = $lucifer[7]; - $b[$i]['month'] = $lucifer[1]; - $b[$i]['day'] = $lucifer[2]; - $b[$i]['year'] = $lucifer[3]; - $b[$i]['hour'] = $lucifer[4]; - $b[$i]['minute'] = $lucifer[5]; - $b[$i]['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]); - $b[$i]['am/pm'] = $lucifer[6]; - $b[$i]['name'] = $lucifer[8]; - } else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) { - echo $line."\n"; - $lcount=count($lucifer); - if ($lcount<8) continue; - $b[$i] = array(); - $b[$i]['isdir'] = $lucifer[0]{0} === "d"; - $b[$i]['islink'] = $lucifer[0]{0} === "l"; - $b[$i]['perms'] = $lucifer[0]; - $b[$i]['number'] = $lucifer[1]; - $b[$i]['owner'] = $lucifer[2]; - $b[$i]['group'] = $lucifer[3]; - $b[$i]['size'] = $lucifer[4]; - if ($lcount==8) { - sscanf($lucifer[5],"%d-%d-%d",$b[$i]['year'],$b[$i]['month'],$b[$i]['day']); - sscanf($lucifer[6],"%d:%d",$b[$i]['hour'],$b[$i]['minute']); - $b[$i]['time'] = @mktime($b[$i]['hour'],$b[$i]['minute'],0,$b[$i]['month'],$b[$i]['day'],$b[$i]['year']); - $b[$i]['name'] = $lucifer[7]; - } else { - $b[$i]['month'] = $lucifer[5]; - $b[$i]['day'] = $lucifer[6]; - if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) { - $b[$i]['year'] = date("Y"); - $b[$i]['hour'] = $l2[1]; - $b[$i]['minute'] = $l2[2]; - } else { - $b[$i]['year'] = $lucifer[7]; - $b[$i]['hour'] = 0; - $b[$i]['minute'] = 0; - } - $b[$i]['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b[$i]['day'],$b[$i]['month'],$b[$i]['year'],$b[$i]['hour'],$b[$i]['minute'])); - $b[$i]['name'] = $lucifer[8]; - } - } - } - return $b; - } - - function rename($from,$to) { //Renames a file on the FTP server - $this->_resetError(); - - $this->_printCommand("RNFR $from"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - $this->_printCommand("RNTO $to"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); - } - - function rmdir($name) { //Removes a directory - $this->_resetError(); - - $this->_printCommand("RMD $name"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); - } - - function set_option() { //Set miscellaneous runtime FTP options - $this->_resetError(); - $this->_setError(-1,"set_option not supported"); - return false; - } - - function site($cmd) { //Sends a SITE command to the server - $this->_resetError(); - - $this->_printCommand("SITE $cmd"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - return true; - } - - function size($name) { //Returns the size of the given file - $this->_resetError(); - - $this->_printCommand("SIZE $name"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - return $lr==FTP_FILE_STATUS ? trim(substr($this->lastLine,4)) : FALSE; - } - - function ssl_connect() { //Opens an Secure SSL-FTP connection - $this->_resetError(); - $this->_setError(-1,"ssl_connect not supported"); - return false; - } - - function systype() { // Returns the system type identifier of the remote FTP server - $this->_resetError(); - - $this->_printCommand("SYST"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - return $lr==FTP_NAME_SYSTEM_TYPE ? trim(substr($this->lastLine,4)) : FALSE; - } - - function getLastResult() { - $this->newResult = FALSE; - return $this->lastResult; - } - - /* private */ - function _hasNewResult() { - return $this->newResult; - } - - /* private */ - function _waitForResult() { - while(!$this->_hasNewResult() && $this->_readln()!==FALSE && !$this->_isError()) { /* noop */ } - } - - /* private */ - function _readln() { - $line = fgets($this->controlSocket); - if ($line === FALSE) { - $this->_setError(-1,"fgets failed in _readln"); - return FALSE; - } - if (strlen($line)==0) return $line; - - $lucifer = array(); - if (preg_match("/^[0-9][0-9][0-9] /",$line,$lucifer)) { - //its a resultline - $this->lastResult = intval($lucifer[0]); - $this->newResult = TRUE; - if (substr($lucifer[0],0,1)=='5') { - $this->_setError($this->lastResult,trim(substr($line,4))); - } - } - - $this->lastLine = trim($line); - $this->lastLines[] = "< ".trim($line); - return $line; - } - - /* private */ - function _printCommand($line) { - $this->lastLines[] = "> ".$line; - fwrite($this->controlSocket,$line."\r\n"); - fflush($this->controlSocket); - } - - /* private */ - function _pasv() { - $this->_resetError(); - $this->_printCommand("PASV"); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if ($this->_isError()) return FALSE; - if ($lr!=FTP_PASSIVE_MODE) return FALSE; - $subject = trim(substr($this->lastLine,4)); - $lucifer = array(); - if (preg_match("/\\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\\)/",$subject,$lucifer)) { - $this->pasvAddr=$lucifer; - - $host = sprintf("%d.%d.%d.%d",$lucifer[1],$lucifer[2],$lucifer[3],$lucifer[4]); - $port = $lucifer[5]*256 + $lucifer[6]; - - $err_no=0; - $err_msg=""; - $passiveConnection = fsockopen($host,$port,$err_no,$err_msg, FTP_TIMEOUT); - if ($err_no!=0) { - $this->_setError($err_no,$err_msg); - return FALSE; - } - - return $passiveConnection; - } - return FALSE; - } - - /* private */ - function _download($cmd) { - if (!($passiveConnection = $this->_pasv())) return FALSE; - $this->_printCommand($cmd); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if (!$this->_isError()) { - $result = ""; - while (!feof($passiveConnection)) { - $result .= fgets($passiveConnection); - } - fclose($passiveConnection); - $this->_waitForResult(); - $lr = $this->getLastResult(); - return ($lr==FTP_FILE_TRANSFER_OK) || ($lr==FTP_FILE_ACTION_OK) || ($lr==FTP_COMMAND_OK) ? $result : FALSE; - } else { - fclose($passiveConnection); - return FALSE; - } - } - - /* upload */ - function _uploadResource($cmd,$resource) { - if (!($passiveConnection = $this->_pasv())) return FALSE; - $this->_printCommand($cmd); - $this->_waitForResult(); - $lr = $this->getLastResult(); - if (!$this->_isError()) { - $result = ""; - while (!feof($resource)) { - $buf = fread($resource,1024); - fwrite($passiveConnection,$buf); - } - fclose($passiveConnection); - $this->_waitForResult(); - $lr = $this->getLastResult(); - return ($lr==FTP_FILE_TRANSFER_OK) || ($lr==FTP_FILE_ACTION_OK) || ($lr==FTP_COMMAND_OK) ? $result : FALSE; - } else { - fclose($passiveConnection); - return FALSE; - } - } - - /* private */ - function _resetError() { - $this->error_no = NULL; - $this->error_msg = NULL; - } - - /* private */ - function _setError($no,$msg) { - if (is_array($this->error_no)) { - $this->error_no[] = $no; - $this->error_msg[] = $msg; - } else if ($this->error_no!=NULL) { - $this->error_no = array($this->error_no,$no); - $this->error_msg = array($this->error_msg,$msg); - } else { - $this->error_no = $no; - $this->error_msg = $msg; - } - } - - /* private */ - function _isError() { - return ($this->error_no != NULL) && ($this->error_no !== 0); - } - - } +_resetError(); + + $err_no = 0; + $err_msg = ""; + $this->controlSocket = @fsockopen($host, $port, $err_no, $err_msg, $timeout) or $this->_setError(-1,"fsockopen failed"); + if ($err_no<>0) $this->setError($err_no,$err_msg); + + if ($this->_isError()) return false; + + @socket_set_timeout($this->controlSocket,$timeout) or $this->_setError(-1,"socket_set_timeout failed"); + if ($this->_isError()) return false; + + $this->_waitForResult(); + if ($this->_isError()) return false; + + return $this->getLastResult() == FTP_SERVICE_READY; + } + + function isConnected() { + return $this->controlSocket != NULL; + } + + function disconnect() { + if (!$this->isConnected()) return; + @fclose($this->controlSocket); + } + + function close() { //Closes an FTP connection + $this->disconnect(); + } + + function login($user, $pass) { //Logs in to an FTP connection + $this->_resetError(); + + $this->_printCommand("USER $user"); + if ($this->_isError()) return false; + + $this->_waitForResult(); + if ($this->_isError()) return false; + + if ($this->getLastResult() == FTP_PASSWORD_NEEDED){ + $this->_printCommand("PASS $pass"); + if ($this->_isError()) return FALSE; + + $this->_waitForResult(); + if ($this->_isError()) return FALSE; + } + + $result = $this->getLastResult() == FTP_USER_LOGGED_IN; + return $result; + } + + function cdup() { //Changes to the parent directory + $this->_resetError(); + + $this->_printCommand("CDUP"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); + } + + function cwd($path) { + $this->_resetError(); + + $this->_printCommand("CWD $path"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); + } + + function cd($path) { + return $this->cwd($path); + } + + function chdir($path) { //Changes directories on a FTP server + return $this->cwd($path); + } + + function chmod($mode,$filename) { //Set permissions on a file via FTP + return $this->site("CHMOD $mode $filename"); + } + + function delete($filename) { //Deletes a file on the FTP server + $this->_resetError(); + + $this->_printCommand("DELE $filename"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); + } + + function exec($cmd) { //Requests execution of a program on the FTP server + return $this->site("EXEC $cmd"); + } + + function fget($fp,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server and saves to an open file + $this->_resetError(); + + $type = "I"; + if ($mode==FTP_ASCII) $type = "A"; + + $this->_printCommand("TYPE $type"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + + $result = $this->_download("RETR $remote"); + if ($result) { + fwrite($fp,$result); + } + return $result; + } + + function fput($remote,$resource,$mode=FTP_BINARY,$startpos=0) { //Uploads from an open file to the FTP server + $this->_resetError(); + + $type = "I"; + if ($mode==FTP_ASCII) $type = "A"; + + $this->_printCommand("TYPE $type"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + + if ($startpos>0) fseek($resource,$startpos); + $result = $this->_uploadResource("STOR $remote",$resource); + return $result; + } + + function get_option($option) { //Retrieves various runtime behaviours of the current FTP stream + $this->_resetError(); + + switch ($option) { + case "FTP_TIMEOUT_SEC" : return FTP_TIMEOUT; + case "PHP_FTP_OPT_AUTOSEEK" : return FALSE; + } + setError(-1,"Unknown option: $option"); + return false; + } + + function get($locale,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server + if (!($fp = @fopen($locale,"wb"))) return FALSE; + $result = $this->fget($fp,$remote,$mode,$resumepos); + @fclose($fp); + if (!$result) @unlink($locale); + return $result; + } + function mdtm($name) { //Returns the last modified time of the given file + $this->_resetError(); + + $this->_printCommand("MDTM $name"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + if ($lr!=FTP_FILE_STATUS) return FALSE; + $subject = trim(substr($this->lastLine,4)); + $lucifer = array(); + if (preg_match("/([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])/",$subject,$lucifer)) + return mktime($lucifer[4],$lucifer[5],$lucifer[6],$lucifer[2],$lucifer[3],$lucifer[1],0); + return FALSE; + } + + function mkdir($name) { //Creates a directory + $this->_resetError(); + + $this->_printCommand("MKD $name"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + return ($lr==FTP_PATHNAME || $lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); + } + + function nb_continue() { //Continues retrieving/sending a file (non-blocking) + $this->_resetError(); + // todo + } + + function nb_fget() { //Retrieves a file from the FTP server and writes it to an open file (non-blocking) + $this->_resetError(); + // todo + } + + function nb_fput() { //Stores a file from an open file to the FTP server (non-blocking) + $this->_resetError(); + // todo + } + + function nb_get() { //Retrieves a file from the FTP server and writes it to a local file (non-blocking) + $this->_resetError(); + // todo + } + + function nb_put() { //Stores a file on the FTP server (non-blocking) + $this->_resetError(); + // todo + } + + function nlist($remote_filespec="") { //Returns a list of files in the given directory + $this->_resetError(); + $result = $this->_download(trim("NLST $remote_filespec")); + return ($result !== FALSE) ? explode("\n",str_replace("\r","",trim($result))) : $result; + } + + function pasv($pasv) { //Turns passive mode on or off + if (!$pasv) { + $this->_setError("Active (PORT) mode is not supported"); + return false; + } + return true; + } + + function put($remote,$local,$mode=FTP_BINARY,$startpos=0) { //Uploads a file to the FTP server + if (!($fp = @fopen($local,"rb"))) return FALSE; + $result = $this->fput($remote,$fp,$mode,$startpos); + @fclose($fp); + return $result; + } + + function pwd() { //Returns the current directory name + $this->_resetError(); + + $this->_printCommand("PWD"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + if ($lr!=FTP_PATHNAME) return FALSE; + $subject = trim(substr($this->lastLine,4)); + $lucifer = array(); + if (preg_match("/\"(.*)\"/",$subject,$lucifer)) return $lucifer[1]; + return FALSE; + } + + function quit() { //Alias of close + $this->close(); + } + + function raw($cmd) { //Sends an arbitrary command to an FTP server + $this->_resetError(); + + $this->_printCommand($cmd); + $this->_waitForResult(); + $this->getLastResult(); + return array($this->lastLine); + } + + function rawlist($remote_filespec="") { //Returns a detailed list of files in the given directory + $this->_resetError(); + $result = $this->_download(trim("LIST $remote_filespec")); + return ($result !== FALSE) ? explode("\n",str_replace("\r","",trim($result))) : $result; + } + + function ls($remote_filespec="") { //Returns a parsed rawlist in an assoc array + $a = $this->rawlist($remote_filespec); + if (!$a) return $a; + $systype = $this->systype(); + $is_windows = stristr($systype,"WIN")!==FALSE; + $b = array(); + while (list($i,$line) = each($a)) { + if ($is_windows && preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|) +(.+)/",$line,$lucifer)) { + $b[$i] = array(); + if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix + $b[$i]['isdir'] = ($lucifer[7]==""); + $b[$i]['size'] = $lucifer[7]; + $b[$i]['month'] = $lucifer[1]; + $b[$i]['day'] = $lucifer[2]; + $b[$i]['year'] = $lucifer[3]; + $b[$i]['hour'] = $lucifer[4]; + $b[$i]['minute'] = $lucifer[5]; + $b[$i]['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]); + $b[$i]['am/pm'] = $lucifer[6]; + $b[$i]['name'] = $lucifer[8]; + } else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) { + echo $line."\n"; + $lcount=count($lucifer); + if ($lcount<8) continue; + $b[$i] = array(); + $b[$i]['isdir'] = $lucifer[0]{0} === "d"; + $b[$i]['islink'] = $lucifer[0]{0} === "l"; + $b[$i]['perms'] = $lucifer[0]; + $b[$i]['number'] = $lucifer[1]; + $b[$i]['owner'] = $lucifer[2]; + $b[$i]['group'] = $lucifer[3]; + $b[$i]['size'] = $lucifer[4]; + if ($lcount==8) { + sscanf($lucifer[5],"%d-%d-%d",$b[$i]['year'],$b[$i]['month'],$b[$i]['day']); + sscanf($lucifer[6],"%d:%d",$b[$i]['hour'],$b[$i]['minute']); + $b[$i]['time'] = @mktime($b[$i]['hour'],$b[$i]['minute'],0,$b[$i]['month'],$b[$i]['day'],$b[$i]['year']); + $b[$i]['name'] = $lucifer[7]; + } else { + $b[$i]['month'] = $lucifer[5]; + $b[$i]['day'] = $lucifer[6]; + if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) { + $b[$i]['year'] = date("Y"); + $b[$i]['hour'] = $l2[1]; + $b[$i]['minute'] = $l2[2]; + } else { + $b[$i]['year'] = $lucifer[7]; + $b[$i]['hour'] = 0; + $b[$i]['minute'] = 0; + } + $b[$i]['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b[$i]['day'],$b[$i]['month'],$b[$i]['year'],$b[$i]['hour'],$b[$i]['minute'])); + $b[$i]['name'] = $lucifer[8]; + } + } + } + return $b; + } + + function rename($from,$to) { //Renames a file on the FTP server + $this->_resetError(); + + $this->_printCommand("RNFR $from"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + $this->_printCommand("RNTO $to"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); + } + + function rmdir($name) { //Removes a directory + $this->_resetError(); + + $this->_printCommand("RMD $name"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK); + } + + function set_option() { //Set miscellaneous runtime FTP options + $this->_resetError(); + $this->_setError(-1,"set_option not supported"); + return false; + } + + function site($cmd) { //Sends a SITE command to the server + $this->_resetError(); + + $this->_printCommand("SITE $cmd"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + return true; + } + + function size($name) { //Returns the size of the given file + $this->_resetError(); + + $this->_printCommand("SIZE $name"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + return $lr==FTP_FILE_STATUS ? trim(substr($this->lastLine,4)) : FALSE; + } + + function ssl_connect() { //Opens an Secure SSL-FTP connection + $this->_resetError(); + $this->_setError(-1,"ssl_connect not supported"); + return false; + } + + function systype() { // Returns the system type identifier of the remote FTP server + $this->_resetError(); + + $this->_printCommand("SYST"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + return $lr==FTP_NAME_SYSTEM_TYPE ? trim(substr($this->lastLine,4)) : FALSE; + } + + function getLastResult() { + $this->newResult = FALSE; + return $this->lastResult; + } + + /* private */ + function _hasNewResult() { + return $this->newResult; + } + + /* private */ + function _waitForResult() { + while(!$this->_hasNewResult() && $this->_readln()!==FALSE && !$this->_isError()) { /* noop */ } + } + + /* private */ + function _readln() { + $line = fgets($this->controlSocket); + if ($line === FALSE) { + $this->_setError(-1,"fgets failed in _readln"); + return FALSE; + } + if (strlen($line)==0) return $line; + + $lucifer = array(); + if (preg_match("/^[0-9][0-9][0-9] /",$line,$lucifer)) { + //its a resultline + $this->lastResult = intval($lucifer[0]); + $this->newResult = TRUE; + if (substr($lucifer[0],0,1)=='5') { + $this->_setError($this->lastResult,trim(substr($line,4))); + } + } + + $this->lastLine = trim($line); + $this->lastLines[] = "< ".trim($line); + return $line; + } + + /* private */ + function _printCommand($line) { + $this->lastLines[] = "> ".$line; + fwrite($this->controlSocket,$line."\r\n"); + fflush($this->controlSocket); + } + + /* private */ + function _pasv() { + $this->_resetError(); + $this->_printCommand("PASV"); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if ($this->_isError()) return FALSE; + if ($lr!=FTP_PASSIVE_MODE) return FALSE; + $subject = trim(substr($this->lastLine,4)); + $lucifer = array(); + if (preg_match("/\\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\\)/",$subject,$lucifer)) { + $this->pasvAddr=$lucifer; + + $host = sprintf("%d.%d.%d.%d",$lucifer[1],$lucifer[2],$lucifer[3],$lucifer[4]); + $port = $lucifer[5]*256 + $lucifer[6]; + + $err_no=0; + $err_msg=""; + $passiveConnection = fsockopen($host,$port,$err_no,$err_msg, FTP_TIMEOUT); + if ($err_no!=0) { + $this->_setError($err_no,$err_msg); + return FALSE; + } + + return $passiveConnection; + } + return FALSE; + } + + /* private */ + function _download($cmd) { + if (!($passiveConnection = $this->_pasv())) return FALSE; + $this->_printCommand($cmd); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if (!$this->_isError()) { + $result = ""; + while (!feof($passiveConnection)) { + $result .= fgets($passiveConnection); + } + fclose($passiveConnection); + $this->_waitForResult(); + $lr = $this->getLastResult(); + return ($lr==FTP_FILE_TRANSFER_OK) || ($lr==FTP_FILE_ACTION_OK) || ($lr==FTP_COMMAND_OK) ? $result : FALSE; + } else { + fclose($passiveConnection); + return FALSE; + } + } + + /* upload */ + function _uploadResource($cmd,$resource) { + if (!($passiveConnection = $this->_pasv())) return FALSE; + $this->_printCommand($cmd); + $this->_waitForResult(); + $lr = $this->getLastResult(); + if (!$this->_isError()) { + $result = ""; + while (!feof($resource)) { + $buf = fread($resource,1024); + fwrite($passiveConnection,$buf); + } + fclose($passiveConnection); + $this->_waitForResult(); + $lr = $this->getLastResult(); + return ($lr==FTP_FILE_TRANSFER_OK) || ($lr==FTP_FILE_ACTION_OK) || ($lr==FTP_COMMAND_OK) ? $result : FALSE; + } else { + fclose($passiveConnection); + return FALSE; + } + } + + /* private */ + function _resetError() { + $this->error_no = NULL; + $this->error_msg = NULL; + } + + /* private */ + function _setError($no,$msg) { + if (is_array($this->error_no)) { + $this->error_no[] = $no; + $this->error_msg[] = $msg; + } else if ($this->error_no!=NULL) { + $this->error_no = array($this->error_no,$no); + $this->error_msg = array($this->error_msg,$msg); + } else { + $this->error_no = $no; + $this->error_msg = $msg; + } + } + + /* private */ + function _isError() { + return ($this->error_no != NULL) && ($this->error_no !== 0); + } + + } ?> \ No newline at end of file diff --git a/wp-admin/includes/class-wp-filesystem-direct.php b/wp-admin/includes/class-wp-filesystem-direct.php index 34ec770690..24ed2a8519 100644 --- a/wp-admin/includes/class-wp-filesystem-direct.php +++ b/wp-admin/includes/class-wp-filesystem-direct.php @@ -1,329 +1,329 @@ -permission = umask(); - } - function connect(){ - return; - } - function setDefaultPermissions($perm){ - $this->permission = $perm; - } - function find_base_dir($base = '.'){ - return str_replace('\\','/',ABSPATH); - } - function get_base_dir($base = '.'){ - return str_replace('\\','/',ABSPATH); - } - function get_contents($file){ - return @file_get_contents($file); - } - function get_contents_array($file){ - return @file($file); - } - function put_contents($file,$contents,$mode=false,$type=''){ - $fp=@fopen($file,'w'.$type); - if (!$fp) - return false; - @fwrite($fp,$contents); - @fclose($fp); - $this->chmod($file,$mode); - return true; - } - function cwd(){ - return @getcwd(); - } - function chgrp($file,$group,$recursive=false){ - if( ! $this->exists($file) ) - return false; - if( ! $recursive ) - return @chgrp($file,$group); - if( ! $this->is_dir($file) ) - return @chgrp($file,$group); - //Is a directory, and we want recursive - $filelist = $this->dirlist($file); - foreach($filelist as $filename){ - $this->chgrp($file.'/'.$filename,$group,$recursive); - } - return true; - } - function chmod($file,$mode=false,$recursive=false){ - if( ! $mode ) - $mode = $this->permission; - if( ! $this->exists($file) ) - return false; - if( ! $recursive ) - return @chmod($file,$mode); - if( ! $this->is_dir($file) ) - return @chmod($file,$mode); - //Is a directory, and we want recursive - $filelist = $this->dirlist($file); - foreach($filelist as $filename){ - $this->chmod($file.'/'.$filename,$mode,$recursive); - } - return true; - } - function chown($file,$owner,$recursive=false){ - if( ! $this->exists($file) ) - return false; - if( ! $recursive ) - return @chown($file,$owner); - if( ! $this->is_dir($file) ) - return @chown($file,$owner); - //Is a directory, and we want recursive - $filelist = $this->dirlist($file); - foreach($filelist as $filename){ - $this->chown($file.'/'.$filename,$owner,$recursive); - } - return true; - } - function owner($file){ - $owneruid=@fileowner($file); - if( ! $owneruid ) - return false; - if( !function_exists('posix_getpwuid') ) - return $owneruid; - $ownerarray=posix_getpwuid($owneruid); - return $ownerarray['name']; - } - function getchmod($file){ - return @fileperms($file); - } - function gethchmod($file){ - //From the PHP.net page for ...? - $perms = $this->getchmod($file); - if (($perms & 0xC000) == 0xC000) { - // Socket - $info = 's'; - } elseif (($perms & 0xA000) == 0xA000) { - // Symbolic Link - $info = 'l'; - } elseif (($perms & 0x8000) == 0x8000) { - // Regular - $info = '-'; - } elseif (($perms & 0x6000) == 0x6000) { - // Block special - $info = 'b'; - } elseif (($perms & 0x4000) == 0x4000) { - // Directory - $info = 'd'; - } elseif (($perms & 0x2000) == 0x2000) { - // Character special - $info = 'c'; - } elseif (($perms & 0x1000) == 0x1000) { - // FIFO pipe - $info = 'p'; - } else { - // Unknown - $info = 'u'; - } - - // Owner - $info .= (($perms & 0x0100) ? 'r' : '-'); - $info .= (($perms & 0x0080) ? 'w' : '-'); - $info .= (($perms & 0x0040) ? - (($perms & 0x0800) ? 's' : 'x' ) : - (($perms & 0x0800) ? 'S' : '-')); - - // Group - $info .= (($perms & 0x0020) ? 'r' : '-'); - $info .= (($perms & 0x0010) ? 'w' : '-'); - $info .= (($perms & 0x0008) ? - (($perms & 0x0400) ? 's' : 'x' ) : - (($perms & 0x0400) ? 'S' : '-')); - - // World - $info .= (($perms & 0x0004) ? 'r' : '-'); - $info .= (($perms & 0x0002) ? 'w' : '-'); - $info .= (($perms & 0x0001) ? - (($perms & 0x0200) ? 't' : 'x' ) : - (($perms & 0x0200) ? 'T' : '-')); - return $info; - } - function getnumchmodfromh($mode) { - $realmode = ""; - $legal = array("","w","r","x","-"); - $attarray = preg_split("//",$mode); - for($i=0;$i'0','r'=>'4','w'=>'2','x'=>'1'); - $mode = strtr($mode,$trans); - $newmode = ''; - $newmode .= $mode[0]+$mode[1]+$mode[2]; - $newmode .= $mode[3]+$mode[4]+$mode[5]; - $newmode .= $mode[6]+$mode[7]+$mode[8]; - return $newmode; - } - function group($file){ - $gid=@filegroup($file); - if( ! $gid ) - return false; - if( !function_exists('posix_getgrgid') ) - return $gid; - $grouparray=posix_getgrgid($gid); - return $grouparray['name']; - } - - function copy($source,$destination,$overwrite=false){ - if( $overwrite && $this->exists($destination) ) - return false; - return copy($source,$destination); +permission = umask(); } - - function move($source,$destination,$overwrite=false){ - //Possible to use rename() - if( $this->copy($source,$destination,$overwrite) && $this->exists($destination) ){ - $this->delete($source); - return true; - } else { - return false; - } + function connect(){ + return; } - - function delete($file,$recursive=false){ - $file = str_replace('\\','/',$file); //for win32, occasional problems deleteing files otherwise - if( $this->is_file($file) ) - return @unlink($file); - if( !$recursive ) - return @rmdir($file); - $filelist = $this->dirlist($file); - - $retval = true; - foreach($filelist as $filename=>$fileinfo){ - if( ! $this->delete($file.'/'.$filename,$recursive) ) - $retval = false; - } - if( ! @rmdir($file) ) - return false; - return $retval; - } - - function exists($file){ - return @file_exists($file); + function setDefaultPermissions($perm){ + $this->permission = $perm; } - - function is_file($file){ - return @is_file($file); + function find_base_dir($base = '.'){ + return str_replace('\\','/',ABSPATH); } - - function is_dir($path){ - return @is_dir($path); + function get_base_dir($base = '.'){ + return str_replace('\\','/',ABSPATH); } - - function is_readable($file){ - return @is_readable($file); + function get_contents($file){ + return @file_get_contents($file); } - - function is_writable($file){ - return @is_writable($file); - } - - function atime($file){ - return @fileatime($file); + function get_contents_array($file){ + return @file($file); } - - function mtime($file){ - return @filemtime($file); - } - function size($file){ - return @filesize($file); + function put_contents($file,$contents,$mode=false,$type=''){ + $fp=@fopen($file,'w'.$type); + if (!$fp) + return false; + @fwrite($fp,$contents); + @fclose($fp); + $this->chmod($file,$mode); + return true; } - - function touch($file,$time=0,$atime=0){ - if($time==0) - $time = time(); - if($atime==0) - $atime = time(); - return @touch($file,$time,$atime); - } - - function mkdir($path,$chmod=false,$chown=false,$chgrp=false){ - if( ! $chmod) - $chmod = $this->permission; - - if( !@mkdir($path,$chmod) ) - return false; - if( $chown ) - $this->chown($path,$chown); - if( $chgrp ) - $this->chgrp($path,$chgrp); - return true; + function cwd(){ + return @getcwd(); } - - function rmdir($path,$recursive=false){ - if( ! $recursive ) - return @rmdir($path); - //recursive: - $filelist = $this->dirlist($path); - foreach($filelist as $filename=>$det){ - if ( '/' == substr($filename,-1,1) ) - $this->rmdir($path.'/'.$filename,$recursive); - @rmdir($entry); - } - return @rmdir($path); - } - - function dirlist($path,$incdot=false,$recursive=false){ - if( $this->is_file($path) ){ - $limitFile = basename($path); - $path = dirname($path); - } else { - $limitFile = false; - } - if( ! $this->is_dir($path) ) - return false; - - $ret = array(); - $dir = dir($path); - while (false !== ($entry = $dir->read())) { - $struc = array(); - $struc['name'] = $entry; - - if( '.' == $struc['name'][0] && !$incdot) - continue; - if( $limitFile && $struc['name'] != $limitFile) - continue; - - $struc['perms'] = $this->gethchmod($path.'/'.$entry); - $struc['permsn'] = $this->getnumchmodfromh($struc['perms']); - $struc['number'] = false; - $struc['owner'] = $this->owner($path.'/'.$entry); - $struc['group'] = $this->group($path.'/'.$entry); - $struc['size'] = $this->size($path.'/'.$entry); - $struc['lastmodunix']= $this->mtime($path.'/'.$entry); - $struc['lastmod'] = date('M j',$struc['lastmodunix']); - $struc['time'] = date('h:i:s',$struc['lastmodunix']); - $struc['type'] = $this->is_dir($path.'/'.$entry) ? 'folder' : 'file'; - if('folder' == $struc['type'] ){ - $struc['files'] = array(); - - if( $incdot ){ - //We're including the doted starts - if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder - if ($recursive) - $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); - } - } else { //No dots - if ($recursive) - $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); - } - } - //File - $ret[$struc['name']] = $struc; - } - $dir->close(); - unset($dir); - return $ret; + function chgrp($file,$group,$recursive=false){ + if( ! $this->exists($file) ) + return false; + if( ! $recursive ) + return @chgrp($file,$group); + if( ! $this->is_dir($file) ) + return @chgrp($file,$group); + //Is a directory, and we want recursive + $filelist = $this->dirlist($file); + foreach($filelist as $filename){ + $this->chgrp($file.'/'.$filename,$group,$recursive); + } + return true; } - - function __destruct(){ - return; - } -} + function chmod($file,$mode=false,$recursive=false){ + if( ! $mode ) + $mode = $this->permission; + if( ! $this->exists($file) ) + return false; + if( ! $recursive ) + return @chmod($file,$mode); + if( ! $this->is_dir($file) ) + return @chmod($file,$mode); + //Is a directory, and we want recursive + $filelist = $this->dirlist($file); + foreach($filelist as $filename){ + $this->chmod($file.'/'.$filename,$mode,$recursive); + } + return true; + } + function chown($file,$owner,$recursive=false){ + if( ! $this->exists($file) ) + return false; + if( ! $recursive ) + return @chown($file,$owner); + if( ! $this->is_dir($file) ) + return @chown($file,$owner); + //Is a directory, and we want recursive + $filelist = $this->dirlist($file); + foreach($filelist as $filename){ + $this->chown($file.'/'.$filename,$owner,$recursive); + } + return true; + } + function owner($file){ + $owneruid=@fileowner($file); + if( ! $owneruid ) + return false; + if( !function_exists('posix_getpwuid') ) + return $owneruid; + $ownerarray=posix_getpwuid($owneruid); + return $ownerarray['name']; + } + function getchmod($file){ + return @fileperms($file); + } + function gethchmod($file){ + //From the PHP.net page for ...? + $perms = $this->getchmod($file); + if (($perms & 0xC000) == 0xC000) { + // Socket + $info = 's'; + } elseif (($perms & 0xA000) == 0xA000) { + // Symbolic Link + $info = 'l'; + } elseif (($perms & 0x8000) == 0x8000) { + // Regular + $info = '-'; + } elseif (($perms & 0x6000) == 0x6000) { + // Block special + $info = 'b'; + } elseif (($perms & 0x4000) == 0x4000) { + // Directory + $info = 'd'; + } elseif (($perms & 0x2000) == 0x2000) { + // Character special + $info = 'c'; + } elseif (($perms & 0x1000) == 0x1000) { + // FIFO pipe + $info = 'p'; + } else { + // Unknown + $info = 'u'; + } + + // Owner + $info .= (($perms & 0x0100) ? 'r' : '-'); + $info .= (($perms & 0x0080) ? 'w' : '-'); + $info .= (($perms & 0x0040) ? + (($perms & 0x0800) ? 's' : 'x' ) : + (($perms & 0x0800) ? 'S' : '-')); + + // Group + $info .= (($perms & 0x0020) ? 'r' : '-'); + $info .= (($perms & 0x0010) ? 'w' : '-'); + $info .= (($perms & 0x0008) ? + (($perms & 0x0400) ? 's' : 'x' ) : + (($perms & 0x0400) ? 'S' : '-')); + + // World + $info .= (($perms & 0x0004) ? 'r' : '-'); + $info .= (($perms & 0x0002) ? 'w' : '-'); + $info .= (($perms & 0x0001) ? + (($perms & 0x0200) ? 't' : 'x' ) : + (($perms & 0x0200) ? 'T' : '-')); + return $info; + } + function getnumchmodfromh($mode) { + $realmode = ""; + $legal = array("","w","r","x","-"); + $attarray = preg_split("//",$mode); + for($i=0;$i'0','r'=>'4','w'=>'2','x'=>'1'); + $mode = strtr($mode,$trans); + $newmode = ''; + $newmode .= $mode[0]+$mode[1]+$mode[2]; + $newmode .= $mode[3]+$mode[4]+$mode[5]; + $newmode .= $mode[6]+$mode[7]+$mode[8]; + return $newmode; + } + function group($file){ + $gid=@filegroup($file); + if( ! $gid ) + return false; + if( !function_exists('posix_getgrgid') ) + return $gid; + $grouparray=posix_getgrgid($gid); + return $grouparray['name']; + } + + function copy($source,$destination,$overwrite=false){ + if( $overwrite && $this->exists($destination) ) + return false; + return copy($source,$destination); + } + + function move($source,$destination,$overwrite=false){ + //Possible to use rename() + if( $this->copy($source,$destination,$overwrite) && $this->exists($destination) ){ + $this->delete($source); + return true; + } else { + return false; + } + } + + function delete($file,$recursive=false){ + $file = str_replace('\\','/',$file); //for win32, occasional problems deleteing files otherwise + if( $this->is_file($file) ) + return @unlink($file); + if( !$recursive ) + return @rmdir($file); + $filelist = $this->dirlist($file); + + $retval = true; + foreach($filelist as $filename=>$fileinfo){ + if( ! $this->delete($file.'/'.$filename,$recursive) ) + $retval = false; + } + if( ! @rmdir($file) ) + return false; + return $retval; + } + + function exists($file){ + return @file_exists($file); + } + + function is_file($file){ + return @is_file($file); + } + + function is_dir($path){ + return @is_dir($path); + } + + function is_readable($file){ + return @is_readable($file); + } + + function is_writable($file){ + return @is_writable($file); + } + + function atime($file){ + return @fileatime($file); + } + + function mtime($file){ + return @filemtime($file); + } + function size($file){ + return @filesize($file); + } + + function touch($file,$time=0,$atime=0){ + if($time==0) + $time = time(); + if($atime==0) + $atime = time(); + return @touch($file,$time,$atime); + } + + function mkdir($path,$chmod=false,$chown=false,$chgrp=false){ + if( ! $chmod) + $chmod = $this->permission; + + if( !@mkdir($path,$chmod) ) + return false; + if( $chown ) + $this->chown($path,$chown); + if( $chgrp ) + $this->chgrp($path,$chgrp); + return true; + } + + function rmdir($path,$recursive=false){ + if( ! $recursive ) + return @rmdir($path); + //recursive: + $filelist = $this->dirlist($path); + foreach($filelist as $filename=>$det){ + if ( '/' == substr($filename,-1,1) ) + $this->rmdir($path.'/'.$filename,$recursive); + @rmdir($entry); + } + return @rmdir($path); + } + + function dirlist($path,$incdot=false,$recursive=false){ + if( $this->is_file($path) ){ + $limitFile = basename($path); + $path = dirname($path); + } else { + $limitFile = false; + } + if( ! $this->is_dir($path) ) + return false; + + $ret = array(); + $dir = dir($path); + while (false !== ($entry = $dir->read())) { + $struc = array(); + $struc['name'] = $entry; + + if( '.' == $struc['name'][0] && !$incdot) + continue; + if( $limitFile && $struc['name'] != $limitFile) + continue; + + $struc['perms'] = $this->gethchmod($path.'/'.$entry); + $struc['permsn'] = $this->getnumchmodfromh($struc['perms']); + $struc['number'] = false; + $struc['owner'] = $this->owner($path.'/'.$entry); + $struc['group'] = $this->group($path.'/'.$entry); + $struc['size'] = $this->size($path.'/'.$entry); + $struc['lastmodunix']= $this->mtime($path.'/'.$entry); + $struc['lastmod'] = date('M j',$struc['lastmodunix']); + $struc['time'] = date('h:i:s',$struc['lastmodunix']); + $struc['type'] = $this->is_dir($path.'/'.$entry) ? 'folder' : 'file'; + if('folder' == $struc['type'] ){ + $struc['files'] = array(); + + if( $incdot ){ + //We're including the doted starts + if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder + if ($recursive) + $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); + } + } else { //No dots + if ($recursive) + $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); + } + } + //File + $ret[$struc['name']] = $struc; + } + $dir->close(); + unset($dir); + return $ret; + } + + function __destruct(){ + return; + } +} ?> \ No newline at end of file diff --git a/wp-admin/includes/class-wp-filesystem-ftpext.php b/wp-admin/includes/class-wp-filesystem-ftpext.php index b0cfbf7e7f..cf40a76eed 100644 --- a/wp-admin/includes/class-wp-filesystem-ftpext.php +++ b/wp-admin/includes/class-wp-filesystem-ftpext.php @@ -1,410 +1,410 @@ -FTP_ASCII, - 'css'=>FTP_ASCII, - 'txt'=>FTP_ASCII, - 'js'=>FTP_ASCII, - 'html'=>FTP_ASCII, - 'htm'=>FTP_ASCII, - 'xml'=>FTP_ASCII, - - 'jpg'=>FTP_BINARY, - 'png'=>FTP_BINARY, - 'gif'=>FTP_BINARY, - 'bmp'=>FTP_BINARY - ); - +FTP_ASCII, + 'css'=>FTP_ASCII, + 'txt'=>FTP_ASCII, + 'js'=>FTP_ASCII, + 'html'=>FTP_ASCII, + 'htm'=>FTP_ASCII, + 'xml'=>FTP_ASCII, + + 'jpg'=>FTP_BINARY, + 'png'=>FTP_BINARY, + 'gif'=>FTP_BINARY, + 'bmp'=>FTP_BINARY + ); + function WP_Filesystem_FTPext($opt='') { $this->errors = new WP_Error(); - - //Check if possible to use ftp functions. + + //Check if possible to use ftp functions. if ( ! extension_loaded('ftp') ) { - $this->errors->add('no_ftp_ext', __('The ftp PHP extension is not available')); - return false; + $this->errors->add('no_ftp_ext', __('The ftp PHP extension is not available')); + return false; } - // Set defaults: - if ( empty($opt['port']) ) - $this->options['port'] = 21; - else - $this->options['port'] = $opt['port']; - + // Set defaults: + if ( empty($opt['port']) ) + $this->options['port'] = 21; + else + $this->options['port'] = $opt['port']; + if ( empty($opt['hostname']) ) - $this->errors->add('empty_hostname', __('FTP hostname is required')); - else - $this->options['hostname'] = $opt['hostname']; - - if ( isset($opt['base']) && ! empty($opt['base']) ) - $this->wp_base = $opt['base']; - - // Check if the options provided are OK. + $this->errors->add('empty_hostname', __('FTP hostname is required')); + else + $this->options['hostname'] = $opt['hostname']; + + if ( isset($opt['base']) && ! empty($opt['base']) ) + $this->wp_base = $opt['base']; + + // Check if the options provided are OK. if ( empty ($opt['username']) ) - $this->errors->add('empty_username', __('FTP username is required')); - else - $this->options['username'] = $opt['username']; - - if ( empty ($opt['password']) ) - $this->errors->add('empty_password', __('FTP password is required')); - else - $this->options['password'] = $opt['password']; - - $this->options['ssl'] = ( !empty($opt['ssl']) ); + $this->errors->add('empty_username', __('FTP username is required')); + else + $this->options['username'] = $opt['username']; + + if ( empty ($opt['password']) ) + $this->errors->add('empty_password', __('FTP password is required')); + else + $this->options['password'] = $opt['password']; + + $this->options['ssl'] = ( !empty($opt['ssl']) ); } - - function connect(){ - if ( $this->options['ssl'] && function_exists('ftp_ssl_connect') ) { - $this->link = ftp_ssl_connect($this->options['hostname'], $this->options['port'],$this->timeout); - } else { - $this->link = ftp_connect($this->options['hostname'], $this->options['port'],$this->timeout); + + function connect(){ + if ( $this->options['ssl'] && function_exists('ftp_ssl_connect') ) { + $this->link = ftp_ssl_connect($this->options['hostname'], $this->options['port'],$this->timeout); + } else { + $this->link = ftp_connect($this->options['hostname'], $this->options['port'],$this->timeout); } - + if ( ! $this->link ) { - $this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port'])); - return false; + $this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port'])); + return false; } - + if ( ! ftp_login($this->link,$this->options['username'], $this->options['password']) ) { $this->errors->add('auth', sprintf(__('Username/Password incorrect for %s'), $this->options['username'])); - return false; + return false; } - return true; + return true; } - - function setDefaultPermissions($perm){ - $this->permission = $perm; + + function setDefaultPermissions($perm){ + $this->permission = $perm; } - - function find_base_dir($base = '.',$echo = false){ - if( empty( $base ) || '.' == $base ) $base = $this->cwd(); - if( empty( $base ) ) $base = '/'; - if( '/' != substr($base, -1) ) $base .= '/'; - - if($echo) echo __('Changing to ') . $base .'
'; - if( false === ftp_chdir($this->link, $base) ) - return false; - - if( $this->exists($base . 'wp-settings.php') ){ - if($echo) echo __('Found ') . $base . 'wp-settings.php
'; - $this->wp_base = $base; - return $this->wp_base; - } - - if( strpos(ABSPATH, $base) > 0) - $arrPath = split('/',substr(ABSPATH,strpos(ABSPATH, $base))); - else - $arrPath = split('/',ABSPATH); - - for($i = 0; $i <= count($arrPath); $i++) - if( $arrPath[ $i ] == '' ) unset( $arrPath[ $i ] ); - - foreach($arrPath as $key=>$folder){ - if( $this->is_dir($base . $folder) ){ - if($echo) echo __('Found ') . $folder . ' ' . __('Changing to') . ' ' . $base . $folder . '/
'; - return $this->find_base_dir($base . $folder . '/',$echo); - } - } - - if( $base == '/' ) - return false; - //If we get this far, somethings gone wrong, change to / and restart the process. - return $this->find_base_dir('/',$echo); - } - function get_base_dir($base = '.'){ - if( empty($this->wp_base) ) - $this->wp_base = $this->find_base_dir($base); - return $this->wp_base; - } - function get_contents($file,$type='',$resumepos=0){ - if( empty($type) ){ - $extension = substr(strrchr($filename, "."), 1); - $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII; - } - $temp = tmpfile(); - if( ! @ftp_fget($this->link,$temp,$file,$type,$resumepos) ) - return false; - fseek($temp, 0); //Skip back to the start of the file being written to - $contents = ''; - while (!feof($temp)) { - $contents .= fread($temp, 8192); - } - fclose($temp); - return $contents; - } - function get_contents_array($file){ - return explode("\n",$this->get_contents($file)); - } - function put_contents($file,$contents,$type=''){ - if( empty($type) ){ - $extension = substr(strrchr($filename, "."), 1); - $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII; - } - $temp = tmpfile(); - fwrite($temp,$contents); - fseek($temp, 0); //Skip back to the start of the file being written to - $ret = @ftp_fput($this->link,$file,$temp,$type); - fclose($temp); - return $ret; - } - function cwd(){ - return ftp_pwd($this->link); - } - function chgrp($file,$group,$recursive=false){ - return false; - } - function chmod($file,$mode=false,$recursive=false){ - if( ! $mode ) - $mode = $this->permission; - if( ! $mode ) - return false; - if( ! $this->exists($file) ) - return false; - if( ! $recursive || ! $this->is_dir($file) ){ - if (!function_exists('ftp_chmod')) - return ftp_site($this->link, sprintf('CHMOD %o %s', $mode, $file)); - return ftp_chmod($this->link,$mode,$file); - } - //Is a directory, and we want recursive - $filelist = $this->dirlist($file); - foreach($filelist as $filename){ - $this->chmod($file.'/'.$filename,$mode,$recursive); - } - return true; - } - function chown($file,$owner,$recursive=false){ - return false; - } - function owner($file){ - $dir = $this->dirlist($file); - return $dir[$file]['owner']; - } - function getchmod($file){ - $dir = $this->dirlist($file); - return $dir[$file]['permsn']; - } - function gethchmod($file){ - //From the PHP.net page for ...? - $perms = $this->getchmod($file); - if (($perms & 0xC000) == 0xC000) { - // Socket - $info = 's'; - } elseif (($perms & 0xA000) == 0xA000) { - // Symbolic Link - $info = 'l'; - } elseif (($perms & 0x8000) == 0x8000) { - // Regular - $info = '-'; - } elseif (($perms & 0x6000) == 0x6000) { - // Block special - $info = 'b'; - } elseif (($perms & 0x4000) == 0x4000) { - // Directory - $info = 'd'; - } elseif (($perms & 0x2000) == 0x2000) { - // Character special - $info = 'c'; - } elseif (($perms & 0x1000) == 0x1000) { - // FIFO pipe - $info = 'p'; - } else { - // Unknown - $info = 'u'; - } - - // Owner - $info .= (($perms & 0x0100) ? 'r' : '-'); - $info .= (($perms & 0x0080) ? 'w' : '-'); - $info .= (($perms & 0x0040) ? - (($perms & 0x0800) ? 's' : 'x' ) : - (($perms & 0x0800) ? 'S' : '-')); - - // Group - $info .= (($perms & 0x0020) ? 'r' : '-'); - $info .= (($perms & 0x0010) ? 'w' : '-'); - $info .= (($perms & 0x0008) ? - (($perms & 0x0400) ? 's' : 'x' ) : - (($perms & 0x0400) ? 'S' : '-')); - - // World - $info .= (($perms & 0x0004) ? 'r' : '-'); - $info .= (($perms & 0x0002) ? 'w' : '-'); - $info .= (($perms & 0x0001) ? - (($perms & 0x0200) ? 't' : 'x' ) : - (($perms & 0x0200) ? 'T' : '-')); - return $info; - } - function getnumchmodfromh($mode) { - $realmode = ""; - $legal = array("","w","r","x","-"); - $attarray = preg_split("//",$mode); - for($i=0;$i'0','r'=>'4','w'=>'2','x'=>'1'); - $mode = strtr($mode,$trans); - $newmode = ''; - $newmode .= $mode[0]+$mode[1]+$mode[2]; - $newmode .= $mode[3]+$mode[4]+$mode[5]; - $newmode .= $mode[6]+$mode[7]+$mode[8]; - return $newmode; - } - function group($file){ - $dir = $this->dirlist($file); - return $dir[$file]['group']; - } - function copy($source,$destination,$overwrite=false){ - if( ! $overwrite && $this->exists($destination) ) - return false; - $content = $this->get_contents($source); - $this->put_contents($destination,$content); - } - function move($source,$destination,$overwrite=false){ - return ftp_rename($this->link,$source,$destination); - } - - function delete($file,$recursive=false) { - if ( $this->is_file($file) ) - return ftp_delete($this->link,$file); - if ( !$recursive ) - return ftp_rmdir($this->link,$file); - $filelist = $this->dirlist($file); - foreach ($filelist as $filename => $fileinfo) { - $this->delete($file.'/'.$filename,$recursive); + + function find_base_dir($base = '.',$echo = false){ + if( empty( $base ) || '.' == $base ) $base = $this->cwd(); + if( empty( $base ) ) $base = '/'; + if( '/' != substr($base, -1) ) $base .= '/'; + + if($echo) echo __('Changing to ') . $base .'
'; + if( false === ftp_chdir($this->link, $base) ) + return false; + + if( $this->exists($base . 'wp-settings.php') ){ + if($echo) echo __('Found ') . $base . 'wp-settings.php
'; + $this->wp_base = $base; + return $this->wp_base; } - return ftp_rmdir($this->link,$file); + + if( strpos(ABSPATH, $base) > 0) + $arrPath = split('/',substr(ABSPATH,strpos(ABSPATH, $base))); + else + $arrPath = split('/',ABSPATH); + + for($i = 0; $i <= count($arrPath); $i++) + if( $arrPath[ $i ] == '' ) unset( $arrPath[ $i ] ); + + foreach($arrPath as $key=>$folder){ + if( $this->is_dir($base . $folder) ){ + if($echo) echo __('Found ') . $folder . ' ' . __('Changing to') . ' ' . $base . $folder . '/
'; + return $this->find_base_dir($base . $folder . '/',$echo); + } + } + + if( $base == '/' ) + return false; + //If we get this far, somethings gone wrong, change to / and restart the process. + return $this->find_base_dir('/',$echo); } - - function exists($file){ + function get_base_dir($base = '.'){ + if( empty($this->wp_base) ) + $this->wp_base = $this->find_base_dir($base); + return $this->wp_base; + } + function get_contents($file,$type='',$resumepos=0){ + if( empty($type) ){ + $extension = substr(strrchr($filename, "."), 1); + $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII; + } + $temp = tmpfile(); + if( ! @ftp_fget($this->link,$temp,$file,$type,$resumepos) ) + return false; + fseek($temp, 0); //Skip back to the start of the file being written to + $contents = ''; + while (!feof($temp)) { + $contents .= fread($temp, 8192); + } + fclose($temp); + return $contents; + } + function get_contents_array($file){ + return explode("\n",$this->get_contents($file)); + } + function put_contents($file,$contents,$type=''){ + if( empty($type) ){ + $extension = substr(strrchr($filename, "."), 1); + $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII; + } + $temp = tmpfile(); + fwrite($temp,$contents); + fseek($temp, 0); //Skip back to the start of the file being written to + $ret = @ftp_fput($this->link,$file,$temp,$type); + fclose($temp); + return $ret; + } + function cwd(){ + return ftp_pwd($this->link); + } + function chgrp($file,$group,$recursive=false){ + return false; + } + function chmod($file,$mode=false,$recursive=false){ + if( ! $mode ) + $mode = $this->permission; + if( ! $mode ) + return false; + if( ! $this->exists($file) ) + return false; + if( ! $recursive || ! $this->is_dir($file) ){ + if (!function_exists('ftp_chmod')) + return ftp_site($this->link, sprintf('CHMOD %o %s', $mode, $file)); + return ftp_chmod($this->link,$mode,$file); + } + //Is a directory, and we want recursive + $filelist = $this->dirlist($file); + foreach($filelist as $filename){ + $this->chmod($file.'/'.$filename,$mode,$recursive); + } + return true; + } + function chown($file,$owner,$recursive=false){ + return false; + } + function owner($file){ + $dir = $this->dirlist($file); + return $dir[$file]['owner']; + } + function getchmod($file){ + $dir = $this->dirlist($file); + return $dir[$file]['permsn']; + } + function gethchmod($file){ + //From the PHP.net page for ...? + $perms = $this->getchmod($file); + if (($perms & 0xC000) == 0xC000) { + // Socket + $info = 's'; + } elseif (($perms & 0xA000) == 0xA000) { + // Symbolic Link + $info = 'l'; + } elseif (($perms & 0x8000) == 0x8000) { + // Regular + $info = '-'; + } elseif (($perms & 0x6000) == 0x6000) { + // Block special + $info = 'b'; + } elseif (($perms & 0x4000) == 0x4000) { + // Directory + $info = 'd'; + } elseif (($perms & 0x2000) == 0x2000) { + // Character special + $info = 'c'; + } elseif (($perms & 0x1000) == 0x1000) { + // FIFO pipe + $info = 'p'; + } else { + // Unknown + $info = 'u'; + } + + // Owner + $info .= (($perms & 0x0100) ? 'r' : '-'); + $info .= (($perms & 0x0080) ? 'w' : '-'); + $info .= (($perms & 0x0040) ? + (($perms & 0x0800) ? 's' : 'x' ) : + (($perms & 0x0800) ? 'S' : '-')); + + // Group + $info .= (($perms & 0x0020) ? 'r' : '-'); + $info .= (($perms & 0x0010) ? 'w' : '-'); + $info .= (($perms & 0x0008) ? + (($perms & 0x0400) ? 's' : 'x' ) : + (($perms & 0x0400) ? 'S' : '-')); + + // World + $info .= (($perms & 0x0004) ? 'r' : '-'); + $info .= (($perms & 0x0002) ? 'w' : '-'); + $info .= (($perms & 0x0001) ? + (($perms & 0x0200) ? 't' : 'x' ) : + (($perms & 0x0200) ? 'T' : '-')); + return $info; + } + function getnumchmodfromh($mode) { + $realmode = ""; + $legal = array("","w","r","x","-"); + $attarray = preg_split("//",$mode); + for($i=0;$i'0','r'=>'4','w'=>'2','x'=>'1'); + $mode = strtr($mode,$trans); + $newmode = ''; + $newmode .= $mode[0]+$mode[1]+$mode[2]; + $newmode .= $mode[3]+$mode[4]+$mode[5]; + $newmode .= $mode[6]+$mode[7]+$mode[8]; + return $newmode; + } + function group($file){ + $dir = $this->dirlist($file); + return $dir[$file]['group']; + } + function copy($source,$destination,$overwrite=false){ + if( ! $overwrite && $this->exists($destination) ) + return false; + $content = $this->get_contents($source); + $this->put_contents($destination,$content); + } + function move($source,$destination,$overwrite=false){ + return ftp_rename($this->link,$source,$destination); + } + + function delete($file,$recursive=false) { + if ( $this->is_file($file) ) + return ftp_delete($this->link,$file); + if ( !$recursive ) + return ftp_rmdir($this->link,$file); + $filelist = $this->dirlist($file); + foreach ($filelist as $filename => $fileinfo) { + $this->delete($file.'/'.$filename,$recursive); + } + return ftp_rmdir($this->link,$file); + } + + function exists($file){ $list = ftp_rawlist($this->link,$file,false); - if( ! $list ) - return false; - return count($list) == 1 ? true : false; - } - function is_file($file){ - return $this->is_dir($file) ? false : true; - } + if( ! $list ) + return false; + return count($list) == 1 ? true : false; + } + function is_file($file){ + return $this->is_dir($file) ? false : true; + } function is_dir($path){ $cwd = $this->cwd(); if ( ftp_chdir($this->link, $path) ) { ftp_chdir($this->link, $cwd); return true; } - return false; - } - function is_readable($file){ - //Get dir list, Check if the file is writable by the current user?? - return true; - } - function is_writable($file){ - //Get dir list, Check if the file is writable by the current user?? - return true; - } - function atime($file){ - return false; - } - function mtime($file){ - return ftp_mdtm($this->link, $file); - } - function size($file){ - return ftp_size($this->link, $file); - } - function touch($file,$time=0,$atime=0){ - return false; - } - function mkdir($path,$chmod=false,$chown=false,$chgrp=false){ - if( !ftp_mkdir($this->link, $path) ) - return false; - if( $chmod ) - $this->chmod($chmod); - if( $chown ) - $this->chown($chown); - if( $chgrp ) - $this->chgrp($chgrp); - return true; - } - function rmdir($path,$recursive=false){ - if( ! $recursive ) - return ftp_rmdir($this->link, $file); - - //TODO: Recursive Directory delete, Have to delete files from the folder first. - //$dir = $this->dirlist($path); - //foreach($dir as $file) - - } - function dirlist($path='.',$incdot=false,$recursive=false){ - if( $this->is_file($path) ){ - $limitFile = basename($path); - $path = dirname($path) . '/'; - } else { - $limitFile = false; - } - //if( ! $this->is_dir($path) ) - // return false; - $list = ftp_rawlist($this->link,$path,false); //We'll do the recursive part ourseves... - //var_dump($list); - if( ! $list ) - return false; - if( empty($list) ) - return array(); - - $ret = array(); + return false; + } + function is_readable($file){ + //Get dir list, Check if the file is writable by the current user?? + return true; + } + function is_writable($file){ + //Get dir list, Check if the file is writable by the current user?? + return true; + } + function atime($file){ + return false; + } + function mtime($file){ + return ftp_mdtm($this->link, $file); + } + function size($file){ + return ftp_size($this->link, $file); + } + function touch($file,$time=0,$atime=0){ + return false; + } + function mkdir($path,$chmod=false,$chown=false,$chgrp=false){ + if( !ftp_mkdir($this->link, $path) ) + return false; + if( $chmod ) + $this->chmod($chmod); + if( $chown ) + $this->chown($chown); + if( $chgrp ) + $this->chgrp($chgrp); + return true; + } + function rmdir($path,$recursive=false){ + if( ! $recursive ) + return ftp_rmdir($this->link, $file); + + //TODO: Recursive Directory delete, Have to delete files from the folder first. + //$dir = $this->dirlist($path); + //foreach($dir as $file) + + } + function dirlist($path='.',$incdot=false,$recursive=false){ + if( $this->is_file($path) ){ + $limitFile = basename($path); + $path = dirname($path) . '/'; + } else { + $limitFile = false; + } + //if( ! $this->is_dir($path) ) + // return false; + $list = ftp_rawlist($this->link,$path,false); //We'll do the recursive part ourseves... + //var_dump($list); + if( ! $list ) + return false; + if( empty($list) ) + return array(); + + $ret = array(); foreach($list as $line){ - if (substr(strtolower($line), 0, 5) == 'total') continue; - $struc = array(); + if (substr(strtolower($line), 0, 5) == 'total') continue; + $struc = array(); $current = preg_split("/[\s]+/",$line,9); - $name_num = count($current) - 1; - $struc['name'] = str_replace('//','',$current[$name_num]); - - if( '.' == $struc['name'][0] && !$incdot) - continue; - if( $limitFile && $struc['name'] != $limitFile) - continue; - - $struc['perms'] = $current[0]; - $struc['permsn'] = $this->getnumchmodfromh($current[0]); - $struc['number'] = $current[1]; - $struc['owner'] = $current[2]; - $struc['group'] = $current[3]; - $struc['size'] = $current[4]; - $struc['lastmod'] = $current[5].' '.$current[6]; - $struc['time'] = $current[7]; - - $struc['type'] = ('d' == $struc['perms'][0] || 'l' == $struc['perms'][0] ) ? 'folder' : 'file'; - if('folder' == $struc['type'] ){ - $struc['files'] = array(); - - if( $incdot ){ - //We're including the doted starts - if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder - if ($recursive) - $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); - } - } else { //No dots - if ($recursive) - $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); - } - } - //File - $ret[$struc['name']] = $struc; + $name_num = count($current) - 1; + $struc['name'] = str_replace('//','',$current[$name_num]); + + if( '.' == $struc['name'][0] && !$incdot) + continue; + if( $limitFile && $struc['name'] != $limitFile) + continue; + + $struc['perms'] = $current[0]; + $struc['permsn'] = $this->getnumchmodfromh($current[0]); + $struc['number'] = $current[1]; + $struc['owner'] = $current[2]; + $struc['group'] = $current[3]; + $struc['size'] = $current[4]; + $struc['lastmod'] = $current[5].' '.$current[6]; + $struc['time'] = $current[7]; + + $struc['type'] = ('d' == $struc['perms'][0] || 'l' == $struc['perms'][0] ) ? 'folder' : 'file'; + if('folder' == $struc['type'] ){ + $struc['files'] = array(); + + if( $incdot ){ + //We're including the doted starts + if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder + if ($recursive) + $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); + } + } else { //No dots + if ($recursive) + $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); + } + } + //File + $ret[$struc['name']] = $struc; } return $ret; - } - function __destruct(){ - if( $this->link ) - ftp_close($this->link); - } + } + function __destruct(){ + if( $this->link ) + ftp_close($this->link); + } } - -?> + +?> diff --git a/wp-admin/includes/class-wp-filesystem-ftpsockets.php b/wp-admin/includes/class-wp-filesystem-ftpsockets.php index 3a06d574c6..338eda9f7b 100644 --- a/wp-admin/includes/class-wp-filesystem-ftpsockets.php +++ b/wp-admin/includes/class-wp-filesystem-ftpsockets.php @@ -1,35 +1,35 @@ -FTP_ASCII, - 'css'=>FTP_ASCII, - 'txt'=>FTP_ASCII, - 'js'=>FTP_ASCII, - 'html'=>FTP_ASCII, - 'htm'=>FTP_ASCII, - 'xml'=>FTP_ASCII, - - 'jpg'=>FTP_BINARY, - 'png'=>FTP_BINARY, - 'gif'=>FTP_BINARY, - 'bmp'=>FTP_BINARY - ); - - function WP_Filesystem_ftpsockets($opt='') { - //Check if possible to use ftp functions. - if( ! @include_once ABSPATH . 'wp-admin/includes/class-ftp.php' ) - return false; - $this->ftp = new FTP(); +FTP_ASCII, + 'css'=>FTP_ASCII, + 'txt'=>FTP_ASCII, + 'js'=>FTP_ASCII, + 'html'=>FTP_ASCII, + 'htm'=>FTP_ASCII, + 'xml'=>FTP_ASCII, + + 'jpg'=>FTP_BINARY, + 'png'=>FTP_BINARY, + 'gif'=>FTP_BINARY, + 'bmp'=>FTP_BINARY + ); + + function WP_Filesystem_ftpsockets($opt='') { + //Check if possible to use ftp functions. + if( ! @include_once ABSPATH . 'wp-admin/includes/class-ftp.php' ) + return false; + $this->ftp = new FTP(); - //Set defaults: + //Set defaults: if ( empty($opt['port']) ) $this->options['port'] = 21; else @@ -53,338 +53,338 @@ class WP_Filesystem_ftpsockets{ $this->errors->add('empty_password', __('FTP password is required')); else $this->options['password'] = $opt['password']; - } + } - function connect() { - if ( ! $this->ftp ) - return false; - + function connect() { + if ( ! $this->ftp ) + return false; + if ( ! $this->ftp->connect($this->options['hostname'], $this->options['port'], $this->timeout) ) { $this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port'])); - return false; + return false; } - + if ( ! $this->ftp->login($this->options['username'], $this->options['password']) ) { $this->errors->add('auth', sprintf(__('Username/Password incorrect for %s'), $this->options['username'])); - return false; + return false; } - - return true; - } - - function setDefaultPermissions($perm) { - $this->permission = $perm; - } - function find_base_dir($base = '.',$echo = false) { - if( empty( $base ) || '.' == $base ) $base = $this->cwd(); - if( empty( $base ) ) $base = '/'; - if( '/' != substr($base, -1) ) $base .= '/'; - - if($echo) echo __('Changing to ') . $base .'
'; - if( false === $this->ftp->chdir($base) ) - return false; - - if( $this->exists($base . 'wp-settings.php') ){ - if($echo) echo __('Found ') . $base . 'wp-settings.php
'; - $this->wp_base = $base; - return $this->wp_base; - } - - if( strpos(ABSPATH, $base) > 0) - $arrPath = split('/',substr(ABSPATH,strpos(ABSPATH, $base))); - else - $arrPath = split('/',ABSPATH); - - for($i = 0; $i <= count($arrPath); $i++) - if( $arrPath[ $i ] == '' ) unset( $arrPath[ $i ] ); - - foreach($arrPath as $key=>$folder){ - if( $this->is_dir($base . $folder) ){ - if($echo) echo __('Found ') . $folder . ' ' . __('Changing to') . ' ' . $base . $folder . '/
'; - return $this->find_base_dir($base . $folder . '/',$echo); - } - } - - if( $base == '/' ) - return false; - //If we get this far, somethings gone wrong, change to / and restart the process. - return $this->find_base_dir('/',$echo); - } - function get_base_dir($base = '.'){ - if( empty($this->wp_base) ) - $this->wp_base = $this->find_base_dir($base); - return $this->wp_base; - } - function get_contents($file,$type='',$resumepos=0){ - if( empty($type) ){ - $extension = substr(strrchr($filename, "."), 1); - $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_AUTOASCII; - } - $this->ftp->SetType($type); - - return $this->ftp->get($file); - } - function get_contents_array($file){ - return explode("\n",$this->get_contents($file)); - } - function put_contents($file,$contents,$type=''){ - if( empty($type) ){ - $extension = substr(strrchr($filename, "."), 1); - $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII; - } - $this->ftp->SetType($type); - - $temp = tmpfile(); - fwrite($temp,$contents); - fseek($temp, 0); //Skip back to the start of the file being written to - $ret = $this->ftp->put($temp, $file); - fclose($temp); - return $ret; - } - function cwd(){ - return $this->ftp->pwd(); - } - function chgrp($file,$group,$recursive=false){ - return false; - } - function chmod($file,$mode=false,$recursive=false){ - if( ! $mode ) - $mode = $this->permission; - if( ! $mode ) - return false; - //if( ! $this->exists($file) ) - // return false; - if( ! $recursive || ! $this->is_dir($file) ){ - return $this->ftp->chmod($file,$mode); - } - //Is a directory, and we want recursive - $filelist = $this->dirlist($file); - foreach($filelist as $filename){ - $this->chmod($file.'/'.$filename,$mode,$recursive); - } - return true; - } - function chown($file,$owner,$recursive=false){ - return false; - } - function owner($file){ - $dir = $this->dirlist($file); - return $dir[$file]['owner']; - } - function getchmod($file){ - $dir = $this->dirlist($file); - return $dir[$file]['permsn']; - } - function gethchmod($file){ - //From the PHP.net page for ...? - $perms = $this->getchmod($file); - if (($perms & 0xC000) == 0xC000) { - // Socket - $info = 's'; - } elseif (($perms & 0xA000) == 0xA000) { - // Symbolic Link - $info = 'l'; - } elseif (($perms & 0x8000) == 0x8000) { - // Regular - $info = '-'; - } elseif (($perms & 0x6000) == 0x6000) { - // Block special - $info = 'b'; - } elseif (($perms & 0x4000) == 0x4000) { - // Directory - $info = 'd'; - } elseif (($perms & 0x2000) == 0x2000) { - // Character special - $info = 'c'; - } elseif (($perms & 0x1000) == 0x1000) { - // FIFO pipe - $info = 'p'; - } else { - // Unknown - $info = 'u'; - } - - // Owner - $info .= (($perms & 0x0100) ? 'r' : '-'); - $info .= (($perms & 0x0080) ? 'w' : '-'); - $info .= (($perms & 0x0040) ? - (($perms & 0x0800) ? 's' : 'x' ) : - (($perms & 0x0800) ? 'S' : '-')); - - // Group - $info .= (($perms & 0x0020) ? 'r' : '-'); - $info .= (($perms & 0x0010) ? 'w' : '-'); - $info .= (($perms & 0x0008) ? - (($perms & 0x0400) ? 's' : 'x' ) : - (($perms & 0x0400) ? 'S' : '-')); - - // World - $info .= (($perms & 0x0004) ? 'r' : '-'); - $info .= (($perms & 0x0002) ? 'w' : '-'); - $info .= (($perms & 0x0001) ? - (($perms & 0x0200) ? 't' : 'x' ) : - (($perms & 0x0200) ? 'T' : '-')); - return $info; - } - function getnumchmodfromh($mode) { - $realmode = ""; - $legal = array("","w","r","x","-"); - $attarray = preg_split("//",$mode); - for($i=0;$i'0','r'=>'4','w'=>'2','x'=>'1'); - $mode = strtr($mode,$trans); - $newmode = ''; - $newmode .= $mode[0]+$mode[1]+$mode[2]; - $newmode .= $mode[3]+$mode[4]+$mode[5]; - $newmode .= $mode[6]+$mode[7]+$mode[8]; - return $newmode; - } - function group($file){ - $dir = $this->dirlist($file); - return $dir[$file]['group']; - } - function copy($source,$destination,$overwrite=false){ - if( ! $overwrite && $this->exists($destination) ) - return false; - $content = $this->get_contents($source); - $this->put_contents($destination,$content); - } - function move($source,$destination,$overwrite=false){ - return $this->ftp->rename($source,$destination); + return true; } - - function delete($file,$recursive=false) { - if ( $this->is_file($file) ) - return $this->ftp->delete($file); - if ( !$recursive ) - return $this->ftp->rmdir($file); - $filelist = $this->dirlist($file); - foreach ($filelist as $filename) { - $this->delete($file.'/'.$filename,$recursive); + + function setDefaultPermissions($perm) { + $this->permission = $perm; + } + + function find_base_dir($base = '.',$echo = false) { + if( empty( $base ) || '.' == $base ) $base = $this->cwd(); + if( empty( $base ) ) $base = '/'; + if( '/' != substr($base, -1) ) $base .= '/'; + + if($echo) echo __('Changing to ') . $base .'
'; + if( false === $this->ftp->chdir($base) ) + return false; + + if( $this->exists($base . 'wp-settings.php') ){ + if($echo) echo __('Found ') . $base . 'wp-settings.php
'; + $this->wp_base = $base; + return $this->wp_base; } - return $this->ftp->rmdir($file); + + if( strpos(ABSPATH, $base) > 0) + $arrPath = split('/',substr(ABSPATH,strpos(ABSPATH, $base))); + else + $arrPath = split('/',ABSPATH); + + for($i = 0; $i <= count($arrPath); $i++) + if( $arrPath[ $i ] == '' ) unset( $arrPath[ $i ] ); + + foreach($arrPath as $key=>$folder){ + if( $this->is_dir($base . $folder) ){ + if($echo) echo __('Found ') . $folder . ' ' . __('Changing to') . ' ' . $base . $folder . '/
'; + return $this->find_base_dir($base . $folder . '/',$echo); + } + } + + if( $base == '/' ) + return false; + //If we get this far, somethings gone wrong, change to / and restart the process. + return $this->find_base_dir('/',$echo); } - - function exists($file){ - return $this->ftp->is_exists($file); - } - function is_file($file){ - //return $this->ftp->file_exists($file); - $list = $this->ftp->rawlist($file,'-a'); - if( ! $list ) - return false; - return ($list[0] == '-'); - } - function is_dir($path){ - $list = $this->ftp->rawlist($file,'-a'); - if( ! $list ) - return false; - return true; - } - function is_readable($file){ - //Get dir list, Check if the file is writable by the current user?? - return true; - } - function is_writable($file){ - //Get dir list, Check if the file is writable by the current user?? - return true; - } - function atime($file){ - return false; - } - function mtime($file){ - return $this->ftp->mdtm($file); - } - function size($file){ - return $this->ftp->filesize($file); - } - function touch($file,$time=0,$atime=0){ - return false; - } - function mkdir($path,$chmod=false,$chown=false,$chgrp=false){ - if( ! $this->ftp->mkdir($path) ) - return false; - if( $chmod ) - $this->chmod($chmod); - if( $chown ) - $this->chown($chown); - if( $chgrp ) - $this->chgrp($chgrp); - return true; - } - function rmdir($path,$recursive=false){ - if( ! $recursive ) - return $this->ftp->rmdir($file); - return false; - //TODO: Recursive Directory delete, Have to delete files from the folder first. - //$dir = $this->dirlist($path); - //foreach($dir as $file) - - } - function dirlist($path='.',$incdot=false,$recursive=false){ - if( $this->is_file($path) ){ - $limitFile = basename($path); - $path = dirname($path) . '/'; - } else { - $limitFile = false; - } - //if( ! $this->is_dir($path) ) - // return false; - $list = $this->ftp->rawlist($path,'-a'); - //var_dump($list); - if( ! $list ) - return false; - if( empty($list) ) - return array(); - - $ret = array(); - foreach($list as $line){ - $struc = array(); - $current = preg_split("/[\s]+/",$line,9); - $struc['name'] = str_replace('//','',$current[8]); - - if( '.' == $struc['name'][0] && !$incdot) - continue; - if( $limitFile && $struc['name'] != $limitFile) - continue; - - $struc['perms'] = $current[0]; - $struc['permsn'] = $this->getnumchmodfromh($current[0]); - $struc['number'] = $current[1]; - $struc['owner'] = $current[2]; - $struc['group'] = $current[3]; - $struc['size'] = $current[4]; - $struc['lastmod'] = $current[5].' '.$current[6]; - $struc['time'] = $current[7]; - - $struc['type'] = ('d' == $struc['perms'][0] || 'l' == $struc['perms'][0] ) ? 'folder' : 'file'; - if('folder' == $struc['type'] ){ - $struc['files'] = array(); - - if( $incdot ){ - //We're including the doted starts - if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder - if ($recursive) - $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); - } - } else { //No dots - if ($recursive) - $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); - } - } - //File - $ret[$struc['name']] = $struc; - } - return $ret; - } - function __destruct(){ - $this->ftp->quit(); - } -} -?> + function get_base_dir($base = '.'){ + if( empty($this->wp_base) ) + $this->wp_base = $this->find_base_dir($base); + return $this->wp_base; + } + function get_contents($file,$type='',$resumepos=0){ + if( empty($type) ){ + $extension = substr(strrchr($filename, "."), 1); + $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_AUTOASCII; + } + $this->ftp->SetType($type); + + return $this->ftp->get($file); + } + function get_contents_array($file){ + return explode("\n",$this->get_contents($file)); + } + function put_contents($file,$contents,$type=''){ + if( empty($type) ){ + $extension = substr(strrchr($filename, "."), 1); + $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII; + } + $this->ftp->SetType($type); + + $temp = tmpfile(); + fwrite($temp,$contents); + fseek($temp, 0); //Skip back to the start of the file being written to + $ret = $this->ftp->put($temp, $file); + fclose($temp); + return $ret; + } + function cwd(){ + return $this->ftp->pwd(); + } + function chgrp($file,$group,$recursive=false){ + return false; + } + function chmod($file,$mode=false,$recursive=false){ + if( ! $mode ) + $mode = $this->permission; + if( ! $mode ) + return false; + //if( ! $this->exists($file) ) + // return false; + if( ! $recursive || ! $this->is_dir($file) ){ + return $this->ftp->chmod($file,$mode); + } + //Is a directory, and we want recursive + $filelist = $this->dirlist($file); + foreach($filelist as $filename){ + $this->chmod($file.'/'.$filename,$mode,$recursive); + } + return true; + } + function chown($file,$owner,$recursive=false){ + return false; + } + function owner($file){ + $dir = $this->dirlist($file); + return $dir[$file]['owner']; + } + function getchmod($file){ + $dir = $this->dirlist($file); + return $dir[$file]['permsn']; + } + function gethchmod($file){ + //From the PHP.net page for ...? + $perms = $this->getchmod($file); + if (($perms & 0xC000) == 0xC000) { + // Socket + $info = 's'; + } elseif (($perms & 0xA000) == 0xA000) { + // Symbolic Link + $info = 'l'; + } elseif (($perms & 0x8000) == 0x8000) { + // Regular + $info = '-'; + } elseif (($perms & 0x6000) == 0x6000) { + // Block special + $info = 'b'; + } elseif (($perms & 0x4000) == 0x4000) { + // Directory + $info = 'd'; + } elseif (($perms & 0x2000) == 0x2000) { + // Character special + $info = 'c'; + } elseif (($perms & 0x1000) == 0x1000) { + // FIFO pipe + $info = 'p'; + } else { + // Unknown + $info = 'u'; + } + + // Owner + $info .= (($perms & 0x0100) ? 'r' : '-'); + $info .= (($perms & 0x0080) ? 'w' : '-'); + $info .= (($perms & 0x0040) ? + (($perms & 0x0800) ? 's' : 'x' ) : + (($perms & 0x0800) ? 'S' : '-')); + + // Group + $info .= (($perms & 0x0020) ? 'r' : '-'); + $info .= (($perms & 0x0010) ? 'w' : '-'); + $info .= (($perms & 0x0008) ? + (($perms & 0x0400) ? 's' : 'x' ) : + (($perms & 0x0400) ? 'S' : '-')); + + // World + $info .= (($perms & 0x0004) ? 'r' : '-'); + $info .= (($perms & 0x0002) ? 'w' : '-'); + $info .= (($perms & 0x0001) ? + (($perms & 0x0200) ? 't' : 'x' ) : + (($perms & 0x0200) ? 'T' : '-')); + return $info; + } + function getnumchmodfromh($mode) { + $realmode = ""; + $legal = array("","w","r","x","-"); + $attarray = preg_split("//",$mode); + for($i=0;$i'0','r'=>'4','w'=>'2','x'=>'1'); + $mode = strtr($mode,$trans); + $newmode = ''; + $newmode .= $mode[0]+$mode[1]+$mode[2]; + $newmode .= $mode[3]+$mode[4]+$mode[5]; + $newmode .= $mode[6]+$mode[7]+$mode[8]; + return $newmode; + } + function group($file){ + $dir = $this->dirlist($file); + return $dir[$file]['group']; + } + function copy($source,$destination,$overwrite=false){ + if( ! $overwrite && $this->exists($destination) ) + return false; + $content = $this->get_contents($source); + $this->put_contents($destination,$content); + } + function move($source,$destination,$overwrite=false){ + return $this->ftp->rename($source,$destination); + } + + function delete($file,$recursive=false) { + if ( $this->is_file($file) ) + return $this->ftp->delete($file); + if ( !$recursive ) + return $this->ftp->rmdir($file); + $filelist = $this->dirlist($file); + foreach ($filelist as $filename) { + $this->delete($file.'/'.$filename,$recursive); + } + return $this->ftp->rmdir($file); + } + + function exists($file){ + return $this->ftp->is_exists($file); + } + function is_file($file){ + //return $this->ftp->file_exists($file); + $list = $this->ftp->rawlist($file,'-a'); + if( ! $list ) + return false; + return ($list[0] == '-'); + } + function is_dir($path){ + $list = $this->ftp->rawlist($file,'-a'); + if( ! $list ) + return false; + return true; + } + function is_readable($file){ + //Get dir list, Check if the file is writable by the current user?? + return true; + } + function is_writable($file){ + //Get dir list, Check if the file is writable by the current user?? + return true; + } + function atime($file){ + return false; + } + function mtime($file){ + return $this->ftp->mdtm($file); + } + function size($file){ + return $this->ftp->filesize($file); + } + function touch($file,$time=0,$atime=0){ + return false; + } + function mkdir($path,$chmod=false,$chown=false,$chgrp=false){ + if( ! $this->ftp->mkdir($path) ) + return false; + if( $chmod ) + $this->chmod($chmod); + if( $chown ) + $this->chown($chown); + if( $chgrp ) + $this->chgrp($chgrp); + return true; + } + function rmdir($path,$recursive=false){ + if( ! $recursive ) + return $this->ftp->rmdir($file); + return false; + //TODO: Recursive Directory delete, Have to delete files from the folder first. + //$dir = $this->dirlist($path); + //foreach($dir as $file) + + } + function dirlist($path='.',$incdot=false,$recursive=false){ + if( $this->is_file($path) ){ + $limitFile = basename($path); + $path = dirname($path) . '/'; + } else { + $limitFile = false; + } + //if( ! $this->is_dir($path) ) + // return false; + $list = $this->ftp->rawlist($path,'-a'); + //var_dump($list); + if( ! $list ) + return false; + if( empty($list) ) + return array(); + + $ret = array(); + foreach($list as $line){ + $struc = array(); + $current = preg_split("/[\s]+/",$line,9); + $struc['name'] = str_replace('//','',$current[8]); + + if( '.' == $struc['name'][0] && !$incdot) + continue; + if( $limitFile && $struc['name'] != $limitFile) + continue; + + $struc['perms'] = $current[0]; + $struc['permsn'] = $this->getnumchmodfromh($current[0]); + $struc['number'] = $current[1]; + $struc['owner'] = $current[2]; + $struc['group'] = $current[3]; + $struc['size'] = $current[4]; + $struc['lastmod'] = $current[5].' '.$current[6]; + $struc['time'] = $current[7]; + + $struc['type'] = ('d' == $struc['perms'][0] || 'l' == $struc['perms'][0] ) ? 'folder' : 'file'; + if('folder' == $struc['type'] ){ + $struc['files'] = array(); + + if( $incdot ){ + //We're including the doted starts + if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder + if ($recursive) + $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); + } + } else { //No dots + if ($recursive) + $struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive); + } + } + //File + $ret[$struc['name']] = $struc; + } + return $ret; + } + function __destruct(){ + $this->ftp->quit(); + } +} +?>