First cut at plugin update. Props DD32 for the filesystem abstraction. see #5586
git-svn-id: http://svn.automattic.com/wordpress/trunk@6779 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
df17a15b02
commit
9aab2ce97a
|
@ -0,0 +1,560 @@
|
|||
<?php
|
||||
//http://phpclasses.dknss.com/browse/package/3174.html
|
||||
define("FTP_TIMEOUT",10);
|
||||
|
||||
// FTP Statuscodes
|
||||
define("FTP_COMMAND_OK",200);
|
||||
define("FTP_FILE_ACTION_OK",250);
|
||||
define("FTP_FILE_TRANSFER_OK",226);
|
||||
define("FTP_COMMAND_NOT_IMPLEMENTED",502);
|
||||
define("FTP_FILE_STATUS",213);
|
||||
define("FTP_NAME_SYSTEM_TYPE",215);
|
||||
define("FTP_PASSIVE_MODE",227);
|
||||
define("FTP_PATHNAME",257);
|
||||
define("FTP_SERVICE_READY",220);
|
||||
define("FTP_USER_LOGGED_IN",230);
|
||||
define("FTP_PASSWORD_NEEDED",331);
|
||||
define("FTP_USER_NOT_LOGGED_IN",530);
|
||||
|
||||
if (!defined("FTP_ASCII")) define("FTP_ASCII",0);
|
||||
if (!defined("FTP_BINARY")) define("FTP_BINARY",1);
|
||||
|
||||
class FTP {
|
||||
|
||||
var $passiveMode = TRUE;
|
||||
var $lastLines = array();
|
||||
var $lastLine = "";
|
||||
var $controlSocket = NULL;
|
||||
var $newResult = FALSE;
|
||||
var $lastResult = -1;
|
||||
var $pasvAddr = NULL;
|
||||
|
||||
var $error_no = NULL;
|
||||
var $error_msg = NULL;
|
||||
|
||||
function FTP() {
|
||||
}
|
||||
|
||||
function connect($host, $port=21, $timeout=FTP_TIMEOUT) { //Opens an FTP connection
|
||||
$this->_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]+|<DIR>) +(.+)/",$line,$lucifer)) {
|
||||
$b[$i] = array();
|
||||
if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
|
||||
$b[$i]['isdir'] = ($lucifer[7]=="<DIR>");
|
||||
$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);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,329 @@
|
|||
<?php
|
||||
|
||||
class WP_Filesystem_Direct{
|
||||
var $permission = null;
|
||||
function WP_Filesystem_Direct($arg){
|
||||
$this->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<count($attarray);$i++){
|
||||
if($key = array_search($attarray[$i],$legal)){
|
||||
$realmode .= $legal[$key];
|
||||
}
|
||||
}
|
||||
$mode = str_pad($realmode,9,'-');
|
||||
$trans = array('-'=>'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;
|
||||
}
|
||||
}
|
||||
?>
|
|
@ -0,0 +1,407 @@
|
|||
<?php
|
||||
class WP_Filesystem_FTPext{
|
||||
var $link;
|
||||
var $timeout = 5;
|
||||
var $errors = array();
|
||||
var $options = array();
|
||||
|
||||
var $wp_base = '';
|
||||
var $permission = null;
|
||||
|
||||
var $filetypes = array(
|
||||
'php'=>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.
|
||||
if ( ! extension_loaded('ftp') ) {
|
||||
$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'];
|
||||
|
||||
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.
|
||||
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']) );
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 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 .'<br>';
|
||||
if( false === ftp_chdir($this->link, $base) )
|
||||
return false;
|
||||
|
||||
if( $this->exists($base . 'wp-settings.php') ){
|
||||
if($echo) echo __('Found ') . $base . 'wp-settings.php<br>';
|
||||
$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 . '/<br>';
|
||||
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<count($attarray);$i++){
|
||||
if($key = array_search($attarray[$i],$legal)){
|
||||
$realmode .= $legal[$key];
|
||||
}
|
||||
}
|
||||
$mode = str_pad($realmode,9,'-');
|
||||
$trans = array('-'=>'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){
|
||||
echo "Delete $file/$filename<br />";
|
||||
$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;
|
||||
}
|
||||
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();
|
||||
foreach($list as $line){
|
||||
if (substr(strtolower($line), 0, 5) == 'total') continue;
|
||||
$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;
|
||||
}
|
||||
}
|
||||
function __destruct(){
|
||||
if( $this->link )
|
||||
ftp_close($this->link);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -0,0 +1,382 @@
|
|||
<?php
|
||||
class WP_Filesystem_ftpsockets{
|
||||
var $ftp = false;
|
||||
var $timeout = 5;
|
||||
var $errors = array();
|
||||
var $options = array();
|
||||
|
||||
var $wp_base = '';
|
||||
var $permission = null;
|
||||
|
||||
var $filetypes = array(
|
||||
'php'=>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:
|
||||
if( ! isset($opt['port']) || empty($opt['port']) )
|
||||
$this->options['port'] = 21;
|
||||
else
|
||||
$this->options['port'] = $opt['port'];
|
||||
|
||||
if( ! isset($opt['hostname']) || empty($opt['hostname']) )
|
||||
$this->errors['require']['hostname'] = __('Hostname');
|
||||
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( ! isset($opt['username']) || empty ($opt['username']) )
|
||||
$this->errors['require']['username'] = __('Username');
|
||||
else
|
||||
$this->options['username'] = $opt['username'];
|
||||
|
||||
if( ! isset($opt['password']) || empty ($opt['password']) )
|
||||
$this->errors['require']['password'] = __('Password');
|
||||
else
|
||||
$this->options['password'] = $opt['password'];
|
||||
}
|
||||
function connect(){
|
||||
if( ! $this->ftp )
|
||||
return false;
|
||||
|
||||
if( ! $this->ftp->connect($this->options['hostname'], $this->options['port'], $this->timeout) ){
|
||||
$this->errors['server'] = __('Failed to connect to FTP Server') . ' ' . $this->options['hostname'] . ':' . $this->options['port'];
|
||||
return false;
|
||||
}
|
||||
if( ! $this->ftp->login($this->options['username'], $this->options['password']) ){
|
||||
$this->errors['auth'] = __('Username/Password incorrect') . ' ' .
|
||||
$this->options['username'] . ':********@' .$this->options['hostname'] . ':' . $this->options['port'];
|
||||
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 .'<br>';
|
||||
if( false === $this->ftp->chdir($base) )
|
||||
return false;
|
||||
|
||||
if( $this->exists($base . 'wp-settings.php') ){
|
||||
if($echo) echo __('Found ') . $base . 'wp-settings.php<br>';
|
||||
$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 . '/<br>';
|
||||
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<count($attarray);$i++){
|
||||
if($key = array_search($attarray[$i],$legal)){
|
||||
$realmode .= $legal[$key];
|
||||
}
|
||||
}
|
||||
$mode = str_pad($realmode,9,'-');
|
||||
$trans = array('-'=>'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);
|
||||
}
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
?>
|
|
@ -171,4 +171,135 @@ function wp_handle_upload( &$file, $overrides = false ) {
|
|||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads a url to a local file using the Snoopy HTTP Class
|
||||
*
|
||||
* @param string $url the URL of the file to download
|
||||
* @return mixed false on failure, string Filename on success.
|
||||
*/
|
||||
function download_url( $url ) {
|
||||
//WARNING: The file is not automatically deleted, The script must unlink() the file.
|
||||
if( ! $url )
|
||||
return false;
|
||||
|
||||
$tmpfname = tempnam('/tmp', 'wpupdate');
|
||||
if( ! $tmpfname )
|
||||
return false;
|
||||
|
||||
$handle = fopen($tmpfname, 'w');
|
||||
if( ! $handle )
|
||||
return false;
|
||||
|
||||
require_once( ABSPATH . 'wp-includes/class-snoopy.php' );
|
||||
$snoopy = new Snoopy();
|
||||
$snoopy->fetch($url);
|
||||
|
||||
fwrite($handle, $snoopy->results);
|
||||
fclose($handle);
|
||||
|
||||
return $tmpfname;
|
||||
}
|
||||
|
||||
function unzip_file($file, $to) {
|
||||
global $wp_filesystem;
|
||||
|
||||
if ( ! $wp_filesystem || !is_object($wp_filesystem) )
|
||||
return new WP_Error('fs_unavailable', __('Could not access filesystem.'));
|
||||
|
||||
$fs =& $wp_filesystem;
|
||||
|
||||
require_once(ABSPATH . 'wp-admin/includes/class-pclzip.php');
|
||||
|
||||
$archive = new PclZip($file);
|
||||
|
||||
// Is the archive valid?
|
||||
if ( false == ($archive_files = $archive->extract(PCLZIP_OPT_EXTRACT_AS_STRING)) )
|
||||
return new WP_Error('incompatible_archive', __('Incompatible archive'), $archive->error_string);
|
||||
|
||||
if ( 0 == count($archive_files) )
|
||||
return new WP_Error('empty_archive', __('Empty archive'));
|
||||
|
||||
$to = trailingslashit($to);
|
||||
$path = explode('/', $to);
|
||||
$tmppath = '';
|
||||
for ( $j = 0; $j < count($path) - 1; $j++ ) {
|
||||
$tmppath .= $path[$j] . '/';
|
||||
if ( ! $fs->is_dir($tmppath) ) {
|
||||
$fs->mkdir($tmppath);
|
||||
} else {
|
||||
$fs->setDefaultPermissions( $fs->getchmod($tmppath) );
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($archive_files as $file) {
|
||||
$path = explode('/', $file['filename']);
|
||||
$tmppath = '';
|
||||
|
||||
// Loop through each of the items and check that the folder exists.
|
||||
for ( $j = 0; $j < count($path) - 1; $j++ ) {
|
||||
$tmppath .= $path[$j] . '/';
|
||||
if ( ! $fs->is_dir($to . $tmppath) )
|
||||
$fs->mkdir($to . $tmppath);
|
||||
}
|
||||
|
||||
// We've made sure the folders are there, so let's extract the file now:
|
||||
if ( ! $file['folder'] )
|
||||
$fs->put_contents( $to . $file['filename'], $file['content']);
|
||||
}
|
||||
}
|
||||
|
||||
function copy_dir($from, $to) {
|
||||
global $wp_filesystem;
|
||||
|
||||
$dirlist = $wp_filesystem->dirlist($from);
|
||||
|
||||
$from = trailingslashit($from);
|
||||
$to = trailingslashit($to);
|
||||
|
||||
foreach ( (array) $dirlist as $filename => $fileinfo ) {
|
||||
if ( 'file' == $fileinfo['type'] ) {
|
||||
$wp_filesystem->copy($from . $filename, $to . $filename, true);
|
||||
} elseif ( 'folder' == $fileinfo['type'] ) {
|
||||
$wp_filesystem->mkdir($to . $filename);
|
||||
copy_dir($from . $filename, $to . $filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function WP_Filesystem( $args = false, $preference = false ) {
|
||||
global $wp_filesystem;
|
||||
|
||||
$method = get_filesystem_method($preference);
|
||||
if ( ! $method )
|
||||
return false;
|
||||
|
||||
require_once('class-wp-filesystem-'.$method.'.php');
|
||||
$method = "WP_Filesystem_$method";
|
||||
|
||||
$wp_filesystem = new $method($args);
|
||||
|
||||
if ( $wp_filesystem->errors->get_error_code() )
|
||||
return false;
|
||||
|
||||
if ( !$wp_filesystem->connect() )
|
||||
return false; //There was an erorr connecting to the server.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function get_filesystem_method() {
|
||||
$tempFile = tempnam('/tmp', 'WPU');
|
||||
|
||||
if ( getmyuid() == fileowner($tempFile) ) {
|
||||
unlink($tempFile);
|
||||
//return 'direct';
|
||||
} else {
|
||||
unlink($tempFile);
|
||||
}
|
||||
|
||||
if ( extension_loaded('ftp') ) return 'ftpext';
|
||||
if ( extension_loaded('sockets') ) return 'ftpsockets';
|
||||
return false;
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -114,9 +114,82 @@ function wp_plugin_update_row( $file ) {
|
|||
$r = $current->response[ $file ];
|
||||
|
||||
echo "<tr><td colspan='5' class='plugin-update'>";
|
||||
printf( __('There is a new version of %s available. <a href="%s">Download version %s here</a>.'), $plugin_data['Name'], $r->url, $r->new_version );
|
||||
printf( __('There is a new version of %1$s available. <a href="%2$s">Download version %3$s here</a> or <a href="%4$s">upgrade automatically</a>.'), $plugin_data['Name'], $r->url, $r->new_version, "update.php?action=upgrade-plugin&plugin=$file" );
|
||||
echo "</td></tr>";
|
||||
}
|
||||
add_action( 'after_plugin_row', 'wp_plugin_update_row' );
|
||||
|
||||
function wp_update_plugin($plugin, $feedback = '') {
|
||||
global $wp_filesystem;
|
||||
|
||||
if ( !empty($feedback) )
|
||||
add_filter('update_feedback', $feedback);
|
||||
|
||||
// Is an update available?
|
||||
$current = get_option( 'update_plugins' );
|
||||
if ( !isset( $current->response[ $plugin ] ) )
|
||||
return new WP_Error('up_to_date', __('The plugin is at the latest version.'));
|
||||
|
||||
// Is a filesystem accessor setup?
|
||||
if ( ! $wp_filesystem || !is_object($wp_filesystem) )
|
||||
WP_Filesystem();
|
||||
|
||||
if ( ! is_object($wp_filesystem) )
|
||||
return new WP_Error('fs_unavailable', __('Could not access filesystem.'));
|
||||
|
||||
if ( $wp_filesystem->errors->get_error_code() )
|
||||
return new WP_Error('fs_error', __('Filesystem error'), $wp_filesystem->errors);
|
||||
|
||||
// Get the URL to the zip file
|
||||
$r = $current->response[ $plugin ];
|
||||
|
||||
if ( empty($r->package) )
|
||||
return new WP_Error('no_package', __('Upgrade package not available.'));
|
||||
|
||||
// Download the package
|
||||
$package = $r->package;
|
||||
apply_filters('update_feedback', __("Downloading update from $package"));
|
||||
$file = download_url($package);
|
||||
|
||||
if ( !$file )
|
||||
return new WP_Error('download_failed', __('Download failed.'));
|
||||
|
||||
$name = basename($plugin, '.php');
|
||||
$working_dir = ABSPATH . 'wp-content/upgrade/' . $name;
|
||||
|
||||
// Clean up working directory
|
||||
$wp_filesystem->delete($working_dir, true);
|
||||
|
||||
apply_filters('update_feedback', __("Unpacking the update"));
|
||||
// Unzip package to working directory
|
||||
$result = unzip_file($file, $working_dir);
|
||||
if ( is_wp_error($result) ) {
|
||||
unlink($file);
|
||||
$wp_filesystem->delete($working_dir, true);
|
||||
return $result;
|
||||
}
|
||||
|
||||
// Once installed, delete the package
|
||||
unlink($file);
|
||||
|
||||
// Remove the existing plugin.
|
||||
apply_filters('update_feedback', __("Removing the old version of the plugin"));
|
||||
$wp_filesystem->delete(ABSPATH . PLUGINDIR . "/$plugin");
|
||||
$plugin_dir = dirname(ABSPATH . PLUGINDIR . "/$plugin");
|
||||
|
||||
// If plugin is in its own directory, recursively delete the directory.
|
||||
if ( '.' != $plugin_dir )
|
||||
$wp_filesystem->delete($plugin_dir, true);
|
||||
|
||||
apply_filters('update_feedback', __("Installing the latest version"));
|
||||
// Copy new version of plugin into place.
|
||||
copy_dir($working_dir, ABSPATH . PLUGINDIR);
|
||||
|
||||
// Remove working directory
|
||||
$wp_filesystem->delete($working_dir, true);
|
||||
|
||||
// Force refresh of plugin update information
|
||||
delete_option('update_plugins');
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
<?php
|
||||
|
||||
require_once('admin.php');
|
||||
|
||||
if ( !current_user_can('edit_plugins') )
|
||||
wp_die('<p>'.__('You do not have sufficient permissions to update plugins for this blog.').'</p>');
|
||||
|
||||
function request_filesystem_credentials($form_post, $type = '') {
|
||||
if ( empty($type) )
|
||||
$type = get_filesystem_method();
|
||||
|
||||
if ( 'direct' == $type )
|
||||
return array();
|
||||
|
||||
if ( !empty($_POST['password']) && !empty($_POST['username']) && !empty($_POST['hostname']) ) {
|
||||
$credentials = array('hostname' => $_POST['hostname'], 'username' => $_POST['username'],
|
||||
'password' => $_POST['password'], 'ssl' => $_POST['ssl']);
|
||||
$stored_credentials = $credentials;
|
||||
unset($stored_credentials['password']);
|
||||
update_option('ftp_credentials', $stored_credentials);
|
||||
return $credentials;
|
||||
}
|
||||
$hostname = '';
|
||||
$username = '';
|
||||
$password = '';
|
||||
$ssl = '';
|
||||
if ( $credentials = get_option('ftp_credentials') )
|
||||
extract($credentials, EXTR_OVERWRITE);
|
||||
?>
|
||||
<form action="<?php echo $form_post ?>" method="post">
|
||||
<div class="wrap">
|
||||
<h2><?php _e('FTP Connection Information') ?></h2>
|
||||
<p><?php _e('To perform the requested update, FTP connection information is required.') ?></p>
|
||||
<table class="niceblue">
|
||||
<tr valign="top">
|
||||
<th scope="row"><?php _e('Hostname:') ?></th>
|
||||
<td><input name="hostname" type="text" id="hostname" value="<?php echo attribute_escape($hostname) ?>" size="40" /></td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<th scope="row"><?php _e('Username:') ?></th>
|
||||
<td><input name="username" type="text" id="username" value="<?php echo attribute_escape($username) ?>" size="40" /></td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<th scope="row"><?php _e('Password:') ?></th>
|
||||
<td><input name="password" type="text" id="password" value="<?php echo attribute_escape($password) ?>" size="40" /></td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<th scope="row"><?php _e('Use SSL:') ?></th>
|
||||
<td>
|
||||
<select name="ssl" id="ssl">
|
||||
<?php
|
||||
foreach ( array(0 => __('No'), 1 => __('Yes')) as $key => $value ) :
|
||||
$selected = ($ssl == $value) ? 'selected="selected"' : '';
|
||||
echo "\n\t<option value='$key' $selected>" . $value . '</option>';
|
||||
endforeach;
|
||||
?>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class="submit">
|
||||
<input type="submit" name="submit" value="<?php _e('Proceed »'); ?>" />
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
return false;
|
||||
}
|
||||
|
||||
function show_message($message) {
|
||||
if ( is_wp_error($message) )
|
||||
$message = $message->get_error_message();
|
||||
echo "<p>$message</p>";
|
||||
}
|
||||
|
||||
function do_plugin_upgrade($plugin) {
|
||||
global $wp_filesystem;
|
||||
|
||||
$credentials = request_filesystem_credentials("update.php?action=upgrade-plugin&plugin=$plugin");
|
||||
if ( false === $credentials )
|
||||
return;
|
||||
echo '<div class="wrap">';
|
||||
echo '<h2>' . __('Upgrade Plugin') . '</h2>';
|
||||
WP_Filesystem($credentials);
|
||||
// TODO: look for auth and connect error codes and direct back to credentials form.
|
||||
if ( $wp_filesystem->errors->get_error_code() ) {
|
||||
foreach ( $wp_filesystem->errors->get_error_messages() as $message )
|
||||
show_message($message);
|
||||
echo '</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
$result = wp_update_plugin($plugin, 'show_message');
|
||||
|
||||
if ( is_wp_error($result) )
|
||||
show_message($result);
|
||||
else
|
||||
echo __('Plugin upgraded successfully');
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
if ( isset($_GET['action']) ) {
|
||||
if ( isset($_GET['plugin']) )
|
||||
$plugin = trim($_GET['plugin']);
|
||||
|
||||
if ( 'upgrade-plugin' == $_GET['action'] ) {
|
||||
//check-admin_referer('upgrade-plugin_' . $plugin);
|
||||
$title = __('Upgrade Plugin');
|
||||
$parent_file = 'plugins.php';
|
||||
require_once('admin-header.php');
|
||||
do_plugin_upgrade($plugin);
|
||||
include('admin-footer.php');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
Loading…
Reference in New Issue