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:
ryan 2008-02-11 05:45:54 +00:00
parent df17a15b02
commit 9aab2ce97a
8 changed files with 7748 additions and 1 deletions

View File

@ -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

View File

@ -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;
}
}
?>

View File

@ -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);
}
}
?>

View File

@ -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();
}
}
?>

View File

@ -171,4 +171,135 @@ function wp_handle_upload( &$file, $overrides = false ) {
return $return; 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;
}
?> ?>

View File

@ -114,9 +114,82 @@ function wp_plugin_update_row( $file ) {
$r = $current->response[ $file ]; $r = $current->response[ $file ];
echo "<tr><td colspan='5' class='plugin-update'>"; 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&amp;plugin=$file" );
echo "</td></tr>"; echo "</td></tr>";
} }
add_action( 'after_plugin_row', 'wp_plugin_update_row' ); 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');
}
?> ?>

117
wp-admin/update.php Normal file
View File

@ -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 &raquo;'); ?>" />
</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');
}
}
?>