WordPress.org

Make WordPress Core

Changeset 7126


Ignore:
Timestamp:
03/01/2008 09:20:23 PM (10 years ago)
Author:
ryan
Message:

Plugin updater updates. see #5586

Location:
trunk/wp-admin/includes
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/class-ftp.php

    r6919 r7126  
    11<?php
    2     //http://phpclasses.dknss.com/browse/package/3174.html
    3     define("FTP_TIMEOUT",10);
    4 
    5     // FTP Statuscodes
    6     define("FTP_COMMAND_OK",200);
    7     define("FTP_FILE_ACTION_OK",250);
    8     define("FTP_FILE_TRANSFER_OK",226);
    9     define("FTP_COMMAND_NOT_IMPLEMENTED",502);
    10     define("FTP_FILE_STATUS",213);
    11     define("FTP_NAME_SYSTEM_TYPE",215);
    12     define("FTP_PASSIVE_MODE",227);
    13     define("FTP_PATHNAME",257);
    14     define("FTP_SERVICE_READY",220);
    15     define("FTP_USER_LOGGED_IN",230);
    16     define("FTP_PASSWORD_NEEDED",331);
    17     define("FTP_USER_NOT_LOGGED_IN",530);
     2if(!defined('CRLF')) define('CRLF',"\r\n");
     3if(!defined("FTP_AUTOASCII")) define("FTP_AUTOASCII", -1);
     4if(!defined("FTP_BINARY")) define("FTP_BINARY", 1);
     5if(!defined("FTP_ASCII")) define("FTP_ASCII", 0);
     6if(!defined('FTP_FORCE')) define('FTP_FORCE', TRUE);
     7define('FTP_OS_Unix','u');
     8define('FTP_OS_Windows','w');
     9define('FTP_OS_Mac','m');
     10
     11class ftp_base {
     12    /* Public variables */
     13    var $LocalEcho;
     14    var $Verbose;
     15    var $OS_local;
     16    var $OS_remote;
    1817   
    19     if (!defined("FTP_ASCII")) define("FTP_ASCII",0);
    20     if (!defined("FTP_BINARY")) define("FTP_BINARY",1);
    21 
    22     class FTP {
    23 
    24         var $passiveMode = TRUE;
    25         var $lastLines = array();
    26         var $lastLine = "";
    27         var $controlSocket = NULL;
    28         var $newResult = FALSE;
    29         var $lastResult = -1;
    30         var $pasvAddr = NULL;
     18    /* Private variables */
     19    var $_lastaction;
     20    var $_errors;
     21    var $_type;
     22    var $_umask;
     23    var $_timeout;
     24    var $_passive;
     25    var $_host;
     26    var $_fullhost;
     27    var $_port;
     28    var $_datahost;
     29    var $_dataport;
     30    var $_ftp_control_sock;
     31    var $_ftp_data_sock;
     32    var $_ftp_temp_sock;
     33    var $_ftp_buff_size;
     34    var $_login;
     35    var $_password;
     36    var $_connected;
     37    var $_ready;
     38    var $_code;
     39    var $_message;
     40    var $_can_restore;
     41    var $_port_available;
     42    var $_curtype;
     43    var $_features;
     44
     45    var $_error_array;
     46    var $AuthorizedTransferMode;
     47    var $OS_FullName;
     48    var $_eol_code;
     49    var $AutoAsciiExt;
     50
     51    /* Constructor */
     52    function ftp_base($port_mode=FALSE) {
     53        $this->__construct($port_mode);
     54    }
     55
     56    function __construct($port_mode=FALSE, $verb=FALSE, $le=FALSE) {
     57        $this->LocalEcho=$le;
     58        $this->Verbose=$verb;
     59        $this->_lastaction=NULL;
     60        $this->_error_array=array();
     61        $this->_eol_code=array(FTP_OS_Unix=>"\n", FTP_OS_Mac=>"\r", FTP_OS_Windows=>"\r\n");
     62        $this->AuthorizedTransferMode=array(FTP_AUTOASCII, FTP_ASCII, FTP_BINARY);
     63        $this->OS_FullName=array(FTP_OS_Unix => 'UNIX', FTP_OS_Windows => 'WINDOWS', FTP_OS_Mac => 'MACOS');
     64        $this->AutoAsciiExt=array("ASP","BAT","C","CPP","CSS","CSV","JS","H","HTM","HTML","SHTML","INI","LOG","PHP3","PHTML","PL","PERL","SH","SQL","TXT");
     65        $this->_port_available=($port_mode==TRUE);
     66        $this->SendMSG("Staring FTP client class".($this->_port_available?"":" without PORT mode support"));
     67        $this->_connected=FALSE;
     68        $this->_ready=FALSE;
     69        $this->_can_restore=FALSE;
     70        $this->_code=0;
     71        $this->_message="";
     72        $this->_ftp_buff_size=4096;
     73        $this->_curtype=NULL;
     74        $this->SetUmask(0022);
     75        $this->SetType(FTP_AUTOASCII);
     76        $this->SetTimeout(30);
     77        $this->Passive(!$this->_port_available);
     78        $this->_login="anonymous";
     79        $this->_password="anon@ftp.com";
     80        $this->_features=array();
     81        $this->OS_local=FTP_OS_Unix;
     82        $this->OS_remote=FTP_OS_Unix;
     83        $this->features=array();
     84        if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $this->OS_local=FTP_OS_Windows;
     85        elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'MAC') $this->OS_local=FTP_OS_Mac;
     86    }
     87
     88// <!-- --------------------------------------------------------------------------------------- -->
     89// <!--       Public functions                                                                  -->
     90// <!-- --------------------------------------------------------------------------------------- -->
     91
     92    function parselisting($line) {
     93        $is_windows = ($this->OS_remote == FTP_OS_Windows);
     94        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)) {
     95            $b = array();
     96            if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
     97            $b['isdir'] = ($lucifer[7]=="<DIR>");
     98            if ( $b['isdir'] )
     99                $b['type'] = 'd';
     100            else
     101                $b['type'] = 'f';
     102            $b['size'] = $lucifer[7];
     103            $b['month'] = $lucifer[1];
     104            $b['day'] = $lucifer[2];
     105            $b['year'] = $lucifer[3];
     106            $b['hour'] = $lucifer[4];
     107            $b['minute'] = $lucifer[5];
     108            $b['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);
     109            $b['am/pm'] = $lucifer[6];
     110            $b['name'] = $lucifer[8];
     111        } else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) {
     112            //echo $line."\n";
     113            $lcount=count($lucifer);
     114            if ($lcount<8) return '';
     115            $b = array();
     116            $b['isdir'] = $lucifer[0]{0} === "d";
     117            $b['islink'] = $lucifer[0]{0} === "l";
     118            if ( $b['isdir'] )
     119                $b['type'] = 'd';
     120            elseif ( $b['islink'] )
     121                $b['type'] = 'l';
     122            else
     123                $b['type'] = 'f';
     124            $b['perms'] = $lucifer[0];
     125            $b['number'] = $lucifer[1];
     126            $b['owner'] = $lucifer[2];
     127            $b['group'] = $lucifer[3];
     128            $b['size'] = $lucifer[4];
     129            if ($lcount==8) {
     130                sscanf($lucifer[5],"%d-%d-%d",$b['year'],$b['month'],$b['day']);
     131                sscanf($lucifer[6],"%d:%d",$b['hour'],$b['minute']);
     132                $b['time'] = @mktime($b['hour'],$b['minute'],0,$b['month'],$b['day'],$b['year']);
     133                $b['name'] = $lucifer[7];
     134            } else {
     135                $b['month'] = $lucifer[5];
     136                $b['day'] = $lucifer[6];
     137                if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) {
     138                    $b['year'] = date("Y");
     139                    $b['hour'] = $l2[1];
     140                    $b['minute'] = $l2[2];
     141                } else {
     142                    $b['year'] = $lucifer[7];
     143                    $b['hour'] = 0;
     144                    $b['minute'] = 0;
     145                }
     146                $b['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute']));
     147                $b['name'] = $lucifer[8];
     148            }
     149        }
     150
     151        return $b;
     152    }
     153
     154    function SendMSG($message = "", $crlf=true) {
     155        if ($this->Verbose) {
     156            echo $message.($crlf?CRLF:"");
     157            flush();
     158        }
     159        return TRUE;
     160    }
     161
     162    function SetType($mode=FTP_AUTOASCII) {
     163        if(!in_array($mode, $this->AuthorizedTransferMode)) {
     164            $this->SendMSG("Wrong type");
     165            return FALSE;
     166        }
     167        $this->_type=$mode;
     168        $this->SendMSG("Transfer type: ".($this->_type==FTP_BINARY?"binary":($this->_type==FTP_ASCII?"ASCII":"auto ASCII") ) );
     169        return TRUE;
     170    }
     171
     172    function _settype($mode=FTP_ASCII) {
     173        if($this->_ready) {
     174            if($mode==FTP_BINARY) {
     175                if($this->_curtype!=FTP_BINARY) {
     176                    if(!$this->_exec("TYPE I", "SetType")) return FALSE;
     177                    $this->_curtype=FTP_BINARY;
     178                }
     179            } elseif($this->_curtype!=FTP_ASCII) {
     180                if(!$this->_exec("TYPE A", "SetType")) return FALSE;
     181                $this->_curtype=FTP_ASCII;
     182            }
     183        } else return FALSE;
     184        return TRUE;
     185    }
     186
     187    function Passive($pasv=NULL) {
     188        if(is_null($pasv)) $this->_passive=!$this->_passive;
     189        else $this->_passive=$pasv;
     190        if(!$this->_port_available and !$this->_passive) {
     191            $this->SendMSG("Only passive connections available!");
     192            $this->_passive=TRUE;
     193            return FALSE;
     194        }
     195        $this->SendMSG("Passive mode ".($this->_passive?"on":"off"));
     196        return TRUE;
     197    }
     198
     199    function SetServer($host, $port=21, $reconnect=true) {
     200        if(!is_long($port)) {
     201            $this->verbose=true;
     202            $this->SendMSG("Incorrect port syntax");
     203            return FALSE;
     204        } else {
     205            $ip=@gethostbyname($host);
     206            $dns=@gethostbyaddr($host);
     207            if(!$ip) $ip=$host;
     208            if(!$dns) $dns=$host;
     209            if(ip2long($ip) === -1) {
     210                $this->SendMSG("Wrong host name/address \"".$host."\"");
     211                return FALSE;
     212            }
     213            $this->_host=$ip;
     214            $this->_fullhost=$dns;
     215            $this->_port=$port;
     216            $this->_dataport=$port-1;
     217        }
     218        $this->SendMSG("Host \"".$this->_fullhost."(".$this->_host."):".$this->_port."\"");
     219        if($reconnect){
     220            if($this->_connected) {
     221                $this->SendMSG("Reconnecting");
     222                if(!$this->quit(FTP_FORCE)) return FALSE;
     223                if(!$this->connect()) return FALSE;
     224            }
     225        }
     226        return TRUE;
     227    }
     228
     229    function SetUmask($umask=0022) {
     230        $this->_umask=$umask;
     231        umask($this->_umask);
     232        $this->SendMSG("UMASK 0".decoct($this->_umask));
     233        return TRUE;
     234    }
     235
     236    function SetTimeout($timeout=30) {
     237        $this->_timeout=$timeout;
     238        $this->SendMSG("Timeout ".$this->_timeout);
     239        if($this->_connected)
     240            if(!$this->_settimeout($this->_ftp_control_sock)) return FALSE;
     241        return TRUE;
     242    }
     243
     244    function connect($server=NULL) {
     245        if(!empty($server)) {
     246            if(!$this->SetServer($server)) return false;
     247        }
     248        if($this->_ready) return true;
     249        $this->SendMsg('Local OS : '.$this->OS_FullName[$this->OS_local]);
     250        if(!($this->_ftp_control_sock = $this->_connect($this->_host, $this->_port))) {
     251            $this->SendMSG("Error : Cannot connect to remote host \"".$this->_fullhost." :".$this->_port."\"");
     252            return FALSE;
     253        }
     254        $this->SendMSG("Connected to remote host \"".$this->_fullhost.":".$this->_port."\". Waiting for greeting.");
     255        do {
     256            if(!$this->_readmsg()) return FALSE;
     257            if(!$this->_checkCode()) return FALSE;
     258            $this->_lastaction=time();
     259        } while($this->_code<200);
     260        $this->_ready=true;
     261        $syst=$this->systype();
     262        if(!$syst) $this->SendMSG("Can't detect remote OS");
     263        else {
     264            if(preg_match("/win|dos|novell/i", $syst[0])) $this->OS_remote=FTP_OS_Windows;
     265            elseif(preg_match("/os/i", $syst[0])) $this->OS_remote=FTP_OS_Mac;
     266            elseif(preg_match("/(li|u)nix/i", $syst[0])) $this->OS_remote=FTP_OS_Unix;
     267            else $this->OS_remote=FTP_OS_Mac;
     268            $this->SendMSG("Remote OS: ".$this->OS_FullName[$this->OS_remote]);
     269        }
     270        if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled");
     271        else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features)));
     272        return TRUE;
     273    }
     274
     275    function quit($force=false) {
     276        if($this->_ready) {
     277            if(!$this->_exec("QUIT") and !$force) return FALSE;
     278            if(!$this->_checkCode() and !$force) return FALSE;
     279            $this->_ready=false;
     280            $this->SendMSG("Session finished");
     281        }
     282        $this->_quit();
     283        return TRUE;
     284    }
     285
     286    function login($user=NULL, $pass=NULL) {
     287        if(!is_null($user)) $this->_login=$user;
     288        else $this->_login="anonymous";
     289        if(!is_null($pass)) $this->_password=$pass;
     290        else $this->_password="anon@anon.com";
     291        if(!$this->_exec("USER ".$this->_login, "login")) return FALSE;
     292        if(!$this->_checkCode()) return FALSE;
     293        if($this->_code!=230) {
     294            if(!$this->_exec((($this->_code==331)?"PASS ":"ACCT ").$this->_password, "login")) return FALSE;
     295            if(!$this->_checkCode()) return FALSE;
     296        }
     297        $this->SendMSG("Authentication succeeded");
     298        if(empty($this->_features)) {
     299            if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled");
     300            else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features)));
     301        }
     302        return TRUE;
     303    }
     304
     305    function pwd() {
     306        if(!$this->_exec("PWD", "pwd")) return FALSE;
     307        if(!$this->_checkCode()) return FALSE;
     308        return ereg_replace("^[0-9]{3} \"(.+)\" .+".CRLF, "\\1", $this->_message);
     309    }
     310
     311    function cdup() {
     312        if(!$this->_exec("CDUP", "cdup")) return FALSE;
     313        if(!$this->_checkCode()) return FALSE;
     314        return true;
     315    }
     316
     317    function chdir($pathname) {
     318        if(!$this->_exec("CWD ".$pathname, "chdir")) return FALSE;
     319        if(!$this->_checkCode()) return FALSE;
     320        return TRUE;
     321    }
     322
     323    function rmdir($pathname) {
     324        if(!$this->_exec("RMD ".$pathname, "rmdir")) return FALSE;
     325        if(!$this->_checkCode()) return FALSE;
     326        return TRUE;
     327    }
     328
     329    function mkdir($pathname) {
     330        if(!$this->_exec("MKD ".$pathname, "mkdir")) return FALSE;
     331        if(!$this->_checkCode()) return FALSE;
     332        return TRUE;
     333    }
     334
     335    function rename($from, $to) {
     336        if(!$this->_exec("RNFR ".$from, "rename")) return FALSE;
     337        if(!$this->_checkCode()) return FALSE;
     338        if($this->_code==350) {
     339            if(!$this->_exec("RNTO ".$to, "rename")) return FALSE;
     340            if(!$this->_checkCode()) return FALSE;
     341        } else return FALSE;
     342        return TRUE;
     343    }
     344
     345    function filesize($pathname) {
     346        if(!isset($this->_features["SIZE"])) {
     347            $this->PushError("filesize", "not supported by server");
     348            return FALSE;
     349        }
     350        if(!$this->_exec("SIZE ".$pathname, "filesize")) return FALSE;
     351        if(!$this->_checkCode()) return FALSE;
     352        return ereg_replace("^[0-9]{3} ([0-9]+)".CRLF, "\\1", $this->_message);
     353    }
     354
     355    function abort() {
     356        if(!$this->_exec("ABOR", "abort")) return FALSE;
     357        if(!$this->_checkCode()) {
     358            if($this->_code!=426) return FALSE;
     359            if(!$this->_readmsg("abort")) return FALSE;
     360            if(!$this->_checkCode()) return FALSE;
     361        }
     362        return true;
     363    }
     364
     365    function mdtm($pathname) {
     366        if(!isset($this->_features["MDTM"])) {
     367            $this->PushError("mdtm", "not supported by server");
     368            return FALSE;
     369        }
     370        if(!$this->_exec("MDTM ".$pathname, "mdtm")) return FALSE;
     371        if(!$this->_checkCode()) return FALSE;
     372        $mdtm = ereg_replace("^[0-9]{3} ([0-9]+)".CRLF, "\\1", $this->_message);
     373        $date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d");
     374        $timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);
     375        return $timestamp;
     376    }
     377
     378    function systype() {
     379        if(!$this->_exec("SYST", "systype")) return FALSE;
     380        if(!$this->_checkCode()) return FALSE;
     381        $DATA = explode(" ", $this->_message);
     382        return array($DATA[1], $DATA[3]);
     383    }
     384
     385    function delete($pathname) {
     386        if(!$this->_exec("DELE ".$pathname, "delete")) return FALSE;
     387        if(!$this->_checkCode()) return FALSE;
     388        return TRUE;
     389    }
     390
     391    function site($command, $fnction="site") {
     392        if(!$this->_exec("SITE ".$command, $fnction)) return FALSE;
     393        if(!$this->_checkCode()) return FALSE;
     394        return TRUE;
     395    }
     396
     397    function chmod($pathname, $mode) {
     398        if(!$this->site( sprintf('CHMOD %o %s', $mode, $pathname), "chmod")) return FALSE;
     399        return TRUE;
     400    }
     401
     402    function restore($from) {
     403        if(!isset($this->_features["REST"])) {
     404            $this->PushError("restore", "not supported by server");
     405            return FALSE;
     406        }
     407        if($this->_curtype!=FTP_BINARY) {
     408            $this->PushError("restore", "can't restore in ASCII mode");
     409            return FALSE;
     410        }
     411        if(!$this->_exec("REST ".$from, "resore")) return FALSE;
     412        if(!$this->_checkCode()) return FALSE;
     413        return TRUE;
     414    }
     415
     416    function features() {
     417        if(!$this->_exec("FEAT", "features")) return FALSE;
     418        if(!$this->_checkCode()) return FALSE;
     419        $f=preg_split("/[".CRLF."]+/", preg_replace("/[0-9]{3}[ -].*[".CRLF."]+/", "", $this->_message), -1, PREG_SPLIT_NO_EMPTY);
     420        $this->_features=array();
     421        foreach($f as $k=>$v) {
     422            $v=explode(" ", trim($v));
     423            $this->_features[array_shift($v)]=$v;;
     424        }
     425        return true;
     426    }
     427
     428    function rawlist($pathname="", $arg="") {
     429        return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "LIST", "rawlist");
     430    }
     431
     432    function nlist($pathname="") {
     433        return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "NLST", "nlist");
     434    }
     435
     436    function is_exists($pathname) {
     437        return $this->file_exists($pathname);
     438    }
     439
     440    function file_exists($pathname) {
     441        $exists=true;
     442        if(!$this->_exec("RNFR ".$pathname, "rename")) $exists=FALSE;
     443        else {
     444            if(!$this->_checkCode()) $exists=FALSE;
     445            $this->abort();
     446        }
     447        if($exists) $this->SendMSG("Remote file ".$pathname." exists");
     448        else $this->SendMSG("Remote file ".$pathname." does not exist");
     449        return $exists;
     450    }
     451
     452    function fget($fp, $remotefile,$rest=0) {
     453        if($this->_can_restore and $rest!=0) fseek($fp, $rest);
     454        $pi=pathinfo($remotefile);
     455        if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
     456        else $mode=FTP_BINARY;
     457        if(!$this->_data_prepare($mode)) {
     458            return FALSE;
     459        }
     460        if($this->_can_restore and $rest!=0) $this->restore($rest);
     461        if(!$this->_exec("RETR ".$remotefile, "get")) {
     462            $this->_data_close();
     463            return FALSE;
     464        }
     465        if(!$this->_checkCode()) {
     466            $this->_data_close();
     467            return FALSE;
     468        }
     469        $out=$this->_data_read($mode, $fp);
     470        $this->_data_close();
     471        if(!$this->_readmsg()) return FALSE;
     472        if(!$this->_checkCode()) return FALSE;
     473        return $out;
     474    }
     475
     476    function get($remotefile, $localfile=NULL, $rest=0) {
     477        if(is_null($localfile)) $localfile=$remotefile;
     478        if (@file_exists($localfile)) $this->SendMSG("Warning : local file will be overwritten");
     479        $fp = @fopen($localfile, "w");
     480        if (!$fp) {
     481            $this->PushError("get","can't open local file", "Cannot create \"".$localfile."\"");
     482            return FALSE;
     483        }
     484        if($this->_can_restore and $rest!=0) fseek($fp, $rest);
     485        $pi=pathinfo($remotefile);
     486        if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
     487        else $mode=FTP_BINARY;
     488        if(!$this->_data_prepare($mode)) {
     489            fclose($fp);
     490            return FALSE;
     491        }
     492        if($this->_can_restore and $rest!=0) $this->restore($rest);
     493        if(!$this->_exec("RETR ".$remotefile, "get")) {
     494            $this->_data_close();
     495            fclose($fp);
     496            return FALSE;
     497        }
     498        if(!$this->_checkCode()) {
     499            $this->_data_close();
     500            fclose($fp);
     501            return FALSE;
     502        }
     503        $out=$this->_data_read($mode, $fp);
     504        fclose($fp);
     505        $this->_data_close();
     506        if(!$this->_readmsg()) return FALSE;
     507        if(!$this->_checkCode()) return FALSE;
     508        return $out;
     509    }
     510
     511    function fput($remotefile, $fp) {
     512        if($this->_can_restore and $rest!=0) fseek($fp, $rest);
     513        $pi=pathinfo($remotefile);
     514        if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
     515        else $mode=FTP_BINARY;
     516        if(!$this->_data_prepare($mode)) {
     517            return FALSE;
     518        }
     519        if($this->_can_restore and $rest!=0) $this->restore($rest);
     520        if(!$this->_exec("STOR ".$remotefile, "put")) {
     521            $this->_data_close();
     522            return FALSE;
     523        }
     524        if(!$this->_checkCode()) {
     525            $this->_data_close();
     526            return FALSE;
     527        }
     528        $ret=$this->_data_write($mode, $fp);
     529        $this->_data_close();
     530        if(!$this->_readmsg()) return FALSE;
     531        if(!$this->_checkCode()) return FALSE;
     532        return $ret;
     533    }
     534
     535    function put($localfile, $remotefile=NULL, $rest=0) {
     536        if(is_null($remotefile)) $remotefile=$localfile;
     537        if (!file_exists($localfile)) {
     538            $this->PushError("put","can't open local file", "No such file or directory \"".$localfile."\"");
     539            return FALSE;
     540        }
     541        $fp = @fopen($localfile, "r");
     542
     543        if (!$fp) {
     544            $this->PushError("put","can't open local file", "Cannot read file \"".$localfile."\"");
     545            return FALSE;
     546        }
     547        if($this->_can_restore and $rest!=0) fseek($fp, $rest);
     548        $pi=pathinfo($localfile);
     549        if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
     550        else $mode=FTP_BINARY;
     551        if(!$this->_data_prepare($mode)) {
     552            fclose($fp);
     553            return FALSE;
     554        }
     555        if($this->_can_restore and $rest!=0) $this->restore($rest);
     556        if(!$this->_exec("STOR ".$remotefile, "put")) {
     557            $this->_data_close();
     558            fclose($fp);
     559            return FALSE;
     560        }
     561        if(!$this->_checkCode()) {
     562            $this->_data_close();
     563            fclose($fp);
     564            return FALSE;
     565        }
     566        $ret=$this->_data_write($mode, $fp);
     567        fclose($fp);
     568        $this->_data_close();
     569        if(!$this->_readmsg()) return FALSE;
     570        if(!$this->_checkCode()) return FALSE;
     571        return $ret;
     572    }
     573
     574    function mput($local=".", $remote=NULL, $continious=false) {
     575        $local=realpath($local);
     576        if(!@file_exists($local)) {
     577            $this->PushError("mput","can't open local folder", "Cannot stat folder \"".$local."\"");
     578            return FALSE;
     579        }
     580        if(!is_dir($local)) return $this->put($local, $remote);
     581        if(empty($remote)) $remote=".";
     582        elseif(!$this->file_exists($remote) and !$this->mkdir($remote)) return FALSE;
     583        if($handle = opendir($local)) {
     584            $list=array();
     585            while (false !== ($file = readdir($handle))) {
     586                if ($file != "." && $file != "..") $list[]=$file;
     587            }
     588            closedir($handle);
     589        } else {
     590            $this->PushError("mput","can't open local folder", "Cannot read folder \"".$local."\"");
     591            return FALSE;
     592        }
     593        if(empty($list)) return TRUE;
     594        $ret=true;
     595        foreach($list as $el) {
     596            if(is_dir($local."/".$el)) $t=$this->mput($local."/".$el, $remote."/".$el);
     597            else $t=$this->put($local."/".$el, $remote."/".$el);
     598            if(!$t) {
     599                $ret=FALSE;
     600                if(!$continious) break;
     601            }
     602        }
     603        return $ret;
    31604       
    32         var $error_no = NULL;
    33         var $error_msg = NULL;
    34        
    35         function FTP() {
    36         }
    37 
    38         function connect($host, $port=21, $timeout=FTP_TIMEOUT) { //Opens an FTP connection
    39             $this->_resetError();
    40 
    41             $err_no = 0;
    42             $err_msg = "";
    43             $this->controlSocket = @fsockopen($host, $port, $err_no, $err_msg, $timeout) or $this->_setError(-1,"fsockopen failed");
    44             if ($err_no<>0) $this->setError($err_no,$err_msg);
    45 
    46             if ($this->_isError()) return false;
    47            
    48             @socket_set_timeout($this->controlSocket,$timeout) or $this->_setError(-1,"socket_set_timeout failed");
    49             if ($this->_isError()) return false;
    50            
    51             $this->_waitForResult();
    52             if ($this->_isError()) return false;
    53            
    54             return $this->getLastResult() == FTP_SERVICE_READY;
    55         }
    56        
    57         function isConnected() {
    58             return $this->controlSocket != NULL;
    59         }
    60        
    61         function disconnect() {
    62             if (!$this->isConnected()) return;
    63             @fclose($this->controlSocket);
    64         }
    65 
    66         function close() { //Closes an FTP connection
    67             $this->disconnect();
    68         }
    69        
    70         function login($user, $pass) {  //Logs in to an FTP connection
    71             $this->_resetError();
    72 
    73             $this->_printCommand("USER $user");
    74             if ($this->_isError()) return false;
    75 
    76             $this->_waitForResult();
    77             if ($this->_isError()) return false;
    78 
    79             if ($this->getLastResult() == FTP_PASSWORD_NEEDED){
    80                 $this->_printCommand("PASS $pass");
    81                 if ($this->_isError()) return FALSE;
    82 
    83                 $this->_waitForResult();
    84                 if ($this->_isError()) return FALSE;
    85             }
    86            
    87             $result = $this->getLastResult() == FTP_USER_LOGGED_IN;
    88             return $result;
    89         }
    90 
    91         function cdup() { //Changes to the parent directory
    92             $this->_resetError();
    93 
    94             $this->_printCommand("CDUP");
    95             $this->_waitForResult();
    96             $lr = $this->getLastResult();
    97             if ($this->_isError()) return FALSE;
    98             return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
    99         }
    100        
    101         function cwd($path) {
    102             $this->_resetError();
    103 
    104             $this->_printCommand("CWD $path");
    105             $this->_waitForResult();
    106             $lr = $this->getLastResult();
    107             if ($this->_isError()) return FALSE;
    108             return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
    109         }
    110 
    111         function cd($path) {
    112             return $this->cwd($path);
    113         }
    114 
    115         function chdir($path) { //Changes directories on a FTP server
    116             return $this->cwd($path);
    117         }
    118 
    119         function chmod($mode,$filename) { //Set permissions on a file via FTP
    120             return $this->site("CHMOD $mode $filename");
    121         }
    122 
    123         function delete($filename) { //Deletes a file on the FTP server
    124             $this->_resetError();
    125 
    126             $this->_printCommand("DELE $filename");
    127             $this->_waitForResult();
    128             $lr = $this->getLastResult();
    129             if ($this->_isError()) return FALSE;
    130             return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
    131         }
    132 
    133         function exec($cmd) { //Requests execution of a program on the FTP server
    134             return $this->site("EXEC $cmd");
    135         }
    136 
    137         function fget($fp,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server and saves to an open file
    138             $this->_resetError();
    139            
    140             $type = "I";
    141             if ($mode==FTP_ASCII) $type = "A";
    142            
    143             $this->_printCommand("TYPE $type");
    144             $this->_waitForResult();
    145             $lr = $this->getLastResult();
    146             if ($this->_isError()) return FALSE;
    147            
    148             $result = $this->_download("RETR $remote");
    149             if ($result) {
    150                 fwrite($fp,$result);
    151             }
    152             return $result;
    153         }
    154 
    155         function fput($remote,$resource,$mode=FTP_BINARY,$startpos=0) { //Uploads from an open file to the FTP server
    156             $this->_resetError();
    157            
    158             $type = "I";
    159             if ($mode==FTP_ASCII) $type = "A";
    160            
    161             $this->_printCommand("TYPE $type");
    162             $this->_waitForResult();
    163             $lr = $this->getLastResult();
    164             if ($this->_isError()) return FALSE;
    165            
    166             if ($startpos>0) fseek($resource,$startpos);
    167             $result = $this->_uploadResource("STOR $remote",$resource);
    168             return $result;
    169         }
    170 
    171         function get_option($option) { //Retrieves various runtime behaviours of the current FTP stream
    172             $this->_resetError();
    173 
    174             switch ($option) {
    175                 case "FTP_TIMEOUT_SEC" : return FTP_TIMEOUT;
    176                 case "PHP_FTP_OPT_AUTOSEEK" : return FALSE;
    177             }
    178             setError(-1,"Unknown option: $option");
     605    }
     606
     607    function mget($remote, $local=".", $continious=false) {
     608        $list=$this->rawlist($remote, "-lA");
     609        if($list===false) {
     610            $this->PushError("mget","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents");
     611            return FALSE;
     612        }
     613        if(empty($list)) return true;
     614        if(!@file_exists($local)) {
     615            if(!@mkdir($local)) {
     616                $this->PushError("mget","can't create local folder", "Cannot create folder \"".$local."\"");
     617                return FALSE;
     618            }
     619        }
     620        foreach($list as $k=>$v) {
     621            $list[$k]=$this->parselisting($v);
     622            if($list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]);
     623        }
     624        $ret=true;
     625        foreach($list as $el) {
     626            if($el["type"]=="d") {
     627                if(!$this->mget($remote."/".$el["name"], $local."/".$el["name"], $continious)) {
     628                    $this->PushError("mget", "can't copy folder", "Can't copy remote folder \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"");
     629                    $ret=false;
     630                    if(!$continious) break;
     631                }
     632            } else {
     633                if(!$this->get($remote."/".$el["name"], $local."/".$el["name"])) {
     634                    $this->PushError("mget", "can't copy file", "Can't copy remote file \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"");
     635                    $ret=false;
     636                    if(!$continious) break;
     637                }
     638            }
     639            @chmod($local."/".$el["name"], $el["perms"]);
     640            $t=strtotime($el["date"]);
     641            if($t!==-1 and $t!==false) @touch($local."/".$el["name"], $t);
     642        }
     643        return $ret;
     644    }
     645
     646    function mdel($remote, $continious=false) {
     647        $list=$this->rawlist($remote, "-la");
     648        if($list===false) {
     649            $this->PushError("mdel","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents");
    179650            return false;
    180651        }
    181 
    182         function get($locale,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server
    183             if (!($fp = @fopen($locale,"wb"))) return FALSE;
    184             $result = $this->fget($fp,$remote,$mode,$resumepos);
    185             @fclose($fp);
    186             if (!$result) @unlink($locale);
    187             return $result;
    188         }
    189         function mdtm($name) { //Returns the last modified time of the given file
    190             $this->_resetError();
    191 
    192             $this->_printCommand("MDTM $name");
    193             $this->_waitForResult();
    194             $lr = $this->getLastResult();
    195             if ($this->_isError()) return FALSE;
    196             if ($lr!=FTP_FILE_STATUS) return FALSE;
    197             $subject = trim(substr($this->lastLine,4));
    198             $lucifer = array();
    199             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))
    200                 return mktime($lucifer[4],$lucifer[5],$lucifer[6],$lucifer[2],$lucifer[3],$lucifer[1],0);
    201             return FALSE;
    202         }
    203 
    204         function mkdir($name) { //Creates a directory
    205             $this->_resetError();
    206 
    207             $this->_printCommand("MKD $name");
    208             $this->_waitForResult();
    209             $lr = $this->getLastResult();
    210             if ($this->_isError()) return FALSE;
    211             return ($lr==FTP_PATHNAME || $lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
    212         }
    213 
    214         function nb_continue() { //Continues retrieving/sending a file (non-blocking)
    215             $this->_resetError();
    216             // todo
    217         }
    218 
    219         function nb_fget() { //Retrieves a file from the FTP server and writes it to an open file (non-blocking)
    220             $this->_resetError();
    221             // todo
    222         }
    223 
    224         function nb_fput() { //Stores a file from an open file to the FTP server (non-blocking)
    225             $this->_resetError();
    226             // todo
    227         }
    228 
    229         function nb_get() { //Retrieves a file from the FTP server and writes it to a local file (non-blocking)
    230             $this->_resetError();
    231             // todo
    232         }
    233 
    234         function nb_put() { //Stores a file on the FTP server (non-blocking)
    235             $this->_resetError();
    236             // todo
    237         }
    238 
    239         function nlist($remote_filespec="") { //Returns a list of files in the given directory
    240             $this->_resetError();
    241             $result = $this->_download(trim("NLST $remote_filespec"));
    242             return ($result !== FALSE) ? explode("\n",str_replace("\r","",trim($result))) : $result;
    243         }
    244        
    245         function pasv($pasv) { //Turns passive mode on or off
    246             if (!$pasv) {
    247                 $this->_setError("Active (PORT) mode is not supported");
    248                 return false;
    249             }
    250             return true;
    251         }
    252 
    253         function put($remote,$local,$mode=FTP_BINARY,$startpos=0) { //Uploads a file to the FTP server
    254             if (!($fp = @fopen($local,"rb"))) return FALSE;
    255             $result = $this->fput($remote,$fp,$mode,$startpos);
    256             @fclose($fp);
    257             return $result;
    258         }
    259 
    260         function pwd() { //Returns the current directory name
    261             $this->_resetError();
    262 
    263             $this->_printCommand("PWD");
    264             $this->_waitForResult();
    265             $lr = $this->getLastResult();
    266             if ($this->_isError()) return FALSE;
    267             if ($lr!=FTP_PATHNAME) return FALSE;
    268             $subject = trim(substr($this->lastLine,4));
    269             $lucifer = array();
    270             if (preg_match("/\"(.*)\"/",$subject,$lucifer)) return $lucifer[1];
    271             return FALSE;
    272         }
    273 
    274         function quit() { //Alias of close
    275             $this->close();
    276         }
    277 
    278         function raw($cmd) { //Sends an arbitrary command to an FTP server
    279             $this->_resetError();
    280 
    281             $this->_printCommand($cmd);
    282             $this->_waitForResult();
    283             $this->getLastResult();
    284             return array($this->lastLine);
    285         }
    286 
    287         function rawlist($remote_filespec="") { //Returns a detailed list of files in the given directory
    288             $this->_resetError();
    289             $result = $this->_download(trim("LIST $remote_filespec"));
    290             return ($result !== FALSE) ? explode("\n",str_replace("\r","",trim($result))) : $result;
    291         }
    292        
    293         function ls($remote_filespec="") { //Returns a parsed rawlist in an assoc array
    294             $a = $this->rawlist($remote_filespec);
    295             if (!$a) return $a;
    296             $systype = $this->systype();
    297             $is_windows = stristr($systype,"WIN")!==FALSE;
    298             $b = array();
    299             while (list($i,$line) = each($a)) {
    300                 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)) {
    301                     $b[$i] = array();
    302                     if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
    303                     $b[$i]['isdir'] = ($lucifer[7]=="<DIR>");
    304                     $b[$i]['size'] = $lucifer[7];
    305                     $b[$i]['month'] = $lucifer[1];
    306                     $b[$i]['day'] = $lucifer[2];
    307                     $b[$i]['year'] = $lucifer[3];
    308                     $b[$i]['hour'] = $lucifer[4];
    309                     $b[$i]['minute'] = $lucifer[5];
    310                     $b[$i]['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);
    311                     $b[$i]['am/pm'] = $lucifer[6];
    312                     $b[$i]['name'] = $lucifer[8];
    313                 } else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) {
    314                     echo $line."\n";
    315                     $lcount=count($lucifer);
    316                     if ($lcount<8) continue;
    317                     $b[$i] = array();
    318                     $b[$i]['isdir'] = $lucifer[0]{0} === "d";
    319                     $b[$i]['islink'] = $lucifer[0]{0} === "l";
    320                     $b[$i]['perms'] = $lucifer[0];
    321                     $b[$i]['number'] = $lucifer[1];
    322                     $b[$i]['owner'] = $lucifer[2];
    323                     $b[$i]['group'] = $lucifer[3];
    324                     $b[$i]['size'] = $lucifer[4];
    325                     if ($lcount==8) {
    326                         sscanf($lucifer[5],"%d-%d-%d",$b[$i]['year'],$b[$i]['month'],$b[$i]['day']);
    327                         sscanf($lucifer[6],"%d:%d",$b[$i]['hour'],$b[$i]['minute']);
    328                         $b[$i]['time'] = @mktime($b[$i]['hour'],$b[$i]['minute'],0,$b[$i]['month'],$b[$i]['day'],$b[$i]['year']);
    329                         $b[$i]['name'] = $lucifer[7];
    330                     } else {
    331                         $b[$i]['month'] = $lucifer[5];
    332                         $b[$i]['day'] = $lucifer[6];
    333                         if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) {
    334                             $b[$i]['year'] = date("Y");
    335                             $b[$i]['hour'] = $l2[1];
    336                             $b[$i]['minute'] = $l2[2];
    337                         } else {
    338                             $b[$i]['year'] = $lucifer[7];
    339                             $b[$i]['hour'] = 0;
    340                             $b[$i]['minute'] = 0;
    341                         }
    342                         $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']));
    343                         $b[$i]['name'] = $lucifer[8];
    344                     }
     652   
     653        foreach($list as $k=>$v) {
     654            $list[$k]=$this->parselisting($v);
     655            if($list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]);
     656        }
     657        $ret=true;
     658   
     659        foreach($list as $el) {
     660            if ( empty($el) )
     661                continue;
     662
     663            if($el["type"]=="d") {
     664                if(!$this->mdel($remote."/".$el["name"], $continious)) {
     665                    $ret=false;
     666                    if(!$continious) break;
    345667                }
    346             }
    347             return $b;
    348         }
    349 
    350         function rename($from,$to) { //Renames a file on the FTP server
    351             $this->_resetError();
    352 
    353             $this->_printCommand("RNFR $from");
    354             $this->_waitForResult();
    355             $lr = $this->getLastResult();
    356             if ($this->_isError()) return FALSE;
    357             $this->_printCommand("RNTO $to");
    358             $this->_waitForResult();
    359             $lr = $this->getLastResult();
    360             if ($this->_isError()) return FALSE;
    361             return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
    362         }
    363 
    364         function rmdir($name) { //Removes a directory
    365             $this->_resetError();
    366 
    367             $this->_printCommand("RMD $name");
    368             $this->_waitForResult();
    369             $lr = $this->getLastResult();
    370             if ($this->_isError()) return FALSE;
    371             return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
    372         }
    373 
    374         function set_option() { //Set miscellaneous runtime FTP options
    375             $this->_resetError();
    376             $this->_setError(-1,"set_option not supported");
     668            } else {
     669                if (!$this->delete($remote."/".$el["name"])) {
     670                    $this->PushError("mdel", "can't delete file", "Can't delete remote file \"".$remote."/".$el["name"]."\"");
     671                    $ret=false;
     672                    if(!$continious) break;
     673                }
     674            }
     675        }
     676   
     677        if(!$this->rmdir($remote)) {
     678            $this->PushError("mdel", "can't delete folder", "Can't delete remote folder \"".$remote."/".$el["name"]."\"");
     679            $ret=false;
     680        }
     681        return $ret;
     682    }
     683
     684    function mmkdir($dir, $mode = 0777) {
     685        if(empty($dir)) return FALSE;
     686        if($this->is_exists($dir) or $dir == "/" ) return TRUE;
     687        if(!$this->mmkdir(dirname($dir), $mode)) return false;
     688        $r=$this->mkdir($dir, $mode);
     689        $this->chmod($dir,$mode);
     690        return $r;
     691    }
     692
     693    function glob($pattern, $handle=NULL) {
     694        $path=$output=null;
     695        if(PHP_OS=='WIN32') $slash='\\';
     696        else $slash='/';
     697        $lastpos=strrpos($pattern,$slash);
     698        if(!($lastpos===false)) {
     699            $path=substr($pattern,0,-$lastpos-1);
     700            $pattern=substr($pattern,$lastpos);
     701        } else $path=getcwd();
     702        if(is_array($handle) and !empty($handle)) {
     703            while($dir=each($handle)) {
     704                if($this->glob_pattern_match($pattern,$dir))
     705                $output[]=$dir;
     706            }
     707        } else {
     708            $handle=@opendir($path);
     709            if($handle===false) return false;
     710            while($dir=readdir($handle)) {
     711                if($this->glob_pattern_match($pattern,$dir))
     712                $output[]=$dir;
     713            }
     714            closedir($handle);
     715        }
     716        if(is_array($output)) return $output;
     717        return false;
     718    }
     719
     720    function glob_pattern_match($pattern,$string) {
     721        $out=null;
     722        $chunks=explode(';',$pattern);
     723        foreach($chunks as $pattern) {
     724            $escape=array('$','^','.','{','}','(',')','[',']','|');
     725            while(strpos($pattern,'**')!==false)
     726                $pattern=str_replace('**','*',$pattern);
     727            foreach($escape as $probe)
     728                $pattern=str_replace($probe,"\\$probe",$pattern);
     729            $pattern=str_replace('?*','*',
     730                str_replace('*?','*',
     731                    str_replace('*',".*",
     732                        str_replace('?','.{1,1}',$pattern))));
     733            $out[]=$pattern;
     734        }
     735        if(count($out)==1) return($this->glob_regexp("^$out[0]$",$string));
     736        else {
     737            foreach($out as $tester)
     738                if($this->my_regexp("^$tester$",$string)) return true;
     739        }
     740        return false;
     741    }
     742
     743    function glob_regexp($pattern,$probe) {
     744        $sensitive=(PHP_OS!='WIN32');
     745        return ($sensitive?
     746            ereg($pattern,$probe):
     747            eregi($pattern,$probe)
     748        );
     749    }
     750
     751    function dirlist($remote) {
     752        $list=$this->rawlist($remote, "-la");
     753        if($list===false) {
     754            $this->PushError("dirlist","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents");
    377755            return false;
    378756        }
    379757
    380         function site($cmd) { //Sends a SITE command to the server
    381             $this->_resetError();
    382 
    383             $this->_printCommand("SITE $cmd");
    384             $this->_waitForResult();
    385             $lr = $this->getLastResult();
    386             if ($this->_isError()) return FALSE;
    387             return true;
    388         }
    389 
    390         function size($name) { //Returns the size of the given file
    391             $this->_resetError();
    392 
    393             $this->_printCommand("SIZE $name");
    394             $this->_waitForResult();
    395             $lr = $this->getLastResult();
    396             if ($this->_isError()) return FALSE;
    397             return $lr==FTP_FILE_STATUS ? trim(substr($this->lastLine,4)) : FALSE;
    398         }
    399 
    400         function ssl_connect() { //Opens an Secure SSL-FTP connection
    401             $this->_resetError();
    402             $this->_setError(-1,"ssl_connect not supported");
    403             return false;
    404         }
    405 
    406         function systype() { // Returns the system type identifier of the remote FTP server
    407             $this->_resetError();
    408 
    409             $this->_printCommand("SYST");
    410             $this->_waitForResult();
    411             $lr = $this->getLastResult();
    412             if ($this->_isError()) return FALSE;
    413             return $lr==FTP_NAME_SYSTEM_TYPE ? trim(substr($this->lastLine,4)) : FALSE;
    414         }
    415 
    416         function getLastResult() {
    417             $this->newResult = FALSE;
    418             return $this->lastResult;
    419         }
    420        
    421         /* private */
    422         function _hasNewResult() {
    423             return $this->newResult;
    424         }
    425        
    426         /* private */
    427         function _waitForResult() {
    428             while(!$this->_hasNewResult() && $this->_readln()!==FALSE && !$this->_isError()) { /* noop  */ }
    429         }
    430        
    431         /* private */
    432         function _readln() {
    433             $line = fgets($this->controlSocket);
    434             if ($line === FALSE) {
    435                 $this->_setError(-1,"fgets failed in _readln");
    436                 return FALSE;
    437             }
    438             if (strlen($line)==0) return $line;
    439 
    440             $lucifer = array();
    441             if (preg_match("/^[0-9][0-9][0-9] /",$line,$lucifer)) {
    442                 //its a resultline
    443                 $this->lastResult = intval($lucifer[0]);
    444                 $this->newResult = TRUE;
    445                 if (substr($lucifer[0],0,1)=='5') {
    446                     $this->_setError($this->lastResult,trim(substr($line,4)));
    447                 }
    448             }
     758        $dirlist = array();
     759        foreach($list as $k=>$v) {
     760            $entry=$this->parselisting($v);
     761            if ( empty($entry) )
     762                continue;
     763
     764            if($entry["name"]=="." or $entry["name"]=="..")
     765                continue;
     766
     767            $dirlist[$entry['name']] = $entry;
     768        }
     769
     770        return $dirlist;
     771    }
     772// <!-- --------------------------------------------------------------------------------------- -->
     773// <!--       Private functions                                                                 -->
     774// <!-- --------------------------------------------------------------------------------------- -->
     775    function _checkCode() {
     776        return ($this->_code<400 and $this->_code>0);
     777    }
     778
     779    function _list($arg="", $cmd="LIST", $fnction="_list") {
     780        if(!$this->_data_prepare()) return false;
     781        if(!$this->_exec($cmd.$arg, $fnction)) {
     782            $this->_data_close();
     783            return FALSE;
     784        }
     785        if(!$this->_checkCode()) {
     786            $this->_data_close();
     787            return FALSE;
     788        }
     789        $out="";
     790        if($this->_code<200) {
     791            $out=$this->_data_read();
     792            $this->_data_close();
     793            if(!$this->_readmsg()) return FALSE;
     794            if(!$this->_checkCode()) return FALSE;
     795            if($out === FALSE ) return FALSE;
     796            $out=preg_split("/[".CRLF."]+/", $out, -1, PREG_SPLIT_NO_EMPTY);
     797//          $this->SendMSG(implode($this->_eol_code[$this->OS_local], $out));
     798        }
     799        return $out;
     800    }
     801
     802// <!-- --------------------------------------------------------------------------------------- -->
     803// <!-- Partie : gestion des erreurs                                                            -->
     804// <!-- --------------------------------------------------------------------------------------- -->
     805// Gnre une erreur pour traitement externe  la classe
     806    function PushError($fctname,$msg,$desc=false){
     807        $error=array();
     808        $error['time']=time();
     809        $error['fctname']=$fctname;
     810        $error['msg']=$msg;
     811        $error['desc']=$desc;
     812        if($desc) $tmp=' ('.$desc.')'; else $tmp='';
     813        $this->SendMSG($fctname.': '.$msg.$tmp);
     814        return(array_push($this->_error_array,$error));
     815    }
    449816   
    450             $this->lastLine = trim($line);
    451             $this->lastLines[] = "< ".trim($line);
    452             return $line;
    453         }
    454        
    455         /* private */
    456         function _printCommand($line) {
    457             $this->lastLines[] = "> ".$line;
    458             fwrite($this->controlSocket,$line."\r\n");
    459             fflush($this->controlSocket);
    460         }
    461        
    462         /* private */
    463         function _pasv() {
    464             $this->_resetError();
    465             $this->_printCommand("PASV");
    466             $this->_waitForResult();
    467             $lr = $this->getLastResult();
    468             if ($this->_isError()) return FALSE;
    469             if ($lr!=FTP_PASSIVE_MODE) return FALSE;
    470             $subject = trim(substr($this->lastLine,4));
    471             $lucifer = array();
    472             if (preg_match("/\\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\\)/",$subject,$lucifer)) {
    473                 $this->pasvAddr=$lucifer;
    474                
    475                 $host = sprintf("%d.%d.%d.%d",$lucifer[1],$lucifer[2],$lucifer[3],$lucifer[4]);
    476                 $port = $lucifer[5]*256 + $lucifer[6];
    477                
    478                 $err_no=0;
    479                 $err_msg="";
    480                 $passiveConnection = fsockopen($host,$port,$err_no,$err_msg, FTP_TIMEOUT);
    481                 if ($err_no!=0) {
    482                     $this->_setError($err_no,$err_msg);
    483                     return FALSE;
    484                 }
    485 
    486                 return $passiveConnection;
    487             }
    488             return FALSE;
    489         }
    490        
    491         /* private */
    492         function _download($cmd) {
    493             if (!($passiveConnection = $this->_pasv())) return FALSE;
    494             $this->_printCommand($cmd);
    495             $this->_waitForResult();
    496             $lr = $this->getLastResult();
    497             if (!$this->_isError()) {
    498                 $result = "";
    499                 while (!feof($passiveConnection)) {
    500                     $result .= fgets($passiveConnection);
    501                 }
    502                 fclose($passiveConnection);
    503                 $this->_waitForResult();
    504                 $lr = $this->getLastResult();
    505                 return ($lr==FTP_FILE_TRANSFER_OK) || ($lr==FTP_FILE_ACTION_OK) || ($lr==FTP_COMMAND_OK) ? $result : FALSE;
    506             } else {
    507                 fclose($passiveConnection);
    508                 return FALSE;
    509             }
    510         }
    511 
    512         /* upload */
    513         function _uploadResource($cmd,$resource) {
    514             if (!($passiveConnection = $this->_pasv())) return FALSE;
    515             $this->_printCommand($cmd);
    516             $this->_waitForResult();
    517             $lr = $this->getLastResult();
    518             if (!$this->_isError()) {
    519                 $result = "";
    520                 while (!feof($resource)) {
    521                     $buf = fread($resource,1024);
    522                     fwrite($passiveConnection,$buf);
    523                 }
    524                 fclose($passiveConnection);
    525                 $this->_waitForResult();
    526                 $lr = $this->getLastResult();
    527                 return ($lr==FTP_FILE_TRANSFER_OK) || ($lr==FTP_FILE_ACTION_OK) || ($lr==FTP_COMMAND_OK) ? $result : FALSE;
    528             } else {
    529                 fclose($passiveConnection);
    530                 return FALSE;
    531             }
    532         }
    533        
    534         /* private */
    535         function _resetError() {
    536             $this->error_no = NULL;
    537             $this->error_msg = NULL;
    538         }
    539 
    540         /* private */
    541         function _setError($no,$msg) {
    542             if (is_array($this->error_no)) {
    543                 $this->error_no[] = $no;
    544                 $this->error_msg[] = $msg;
    545             } else if ($this->error_no!=NULL) {
    546                 $this->error_no = array($this->error_no,$no);
    547                 $this->error_msg = array($this->error_msg,$msg);
    548             } else {
    549                 $this->error_no = $no;
    550                 $this->error_msg = $msg;
    551             }
    552         }
    553        
    554         /* private */
    555         function _isError() {
    556             return ($this->error_no != NULL) && ($this->error_no !== 0);
    557         }
    558 
    559     }
     817// Rcupre une erreur externe
     818    function PopError(){
     819        if(count($this->_error_array)) return(array_pop($this->_error_array));
     820            else return(false);
     821    }
     822}
     823
     824$mod_sockets=TRUE;
     825if (!extension_loaded('sockets')) {
     826    $prefix = (PHP_SHLIB_SUFFIX == 'dll') ? 'php_' : '';
     827    if(!@dl($prefix . 'sockets.' . PHP_SHLIB_SUFFIX)) $mod_sockets=FALSE;
     828}
     829require_once "class-ftp-".($mod_sockets?"sockets":"pure").".php";
    560830?>
  • trunk/wp-admin/includes/class-wp-filesystem-ftpext.php

    r7063 r7126  
    167167        if( ! $mode )
    168168            return false;
    169         if( ! $this->exists($file) )
    170             return false;
    171         if( ! $recursive || ! $this->is_dir($file) ){
     169        if ( ! $this->exists($file) )
     170            return false;
     171        if ( ! $recursive || ! $this->is_dir($file) ){
    172172            if (!function_exists('ftp_chmod'))
    173173                return ftp_site($this->link, sprintf('CHMOD %o %s', $mode, $file));
     
    268268        if( ! $overwrite && $this->exists($destination) )
    269269            return false;
    270         $content = $this->get_contents($source);
    271         $this->put_contents($destination,$content);
     270        if ( !$content = $this->get_contents($source) )
     271            return false;
     272        return $this->put_contents($destination,$content);
    272273    }
    273274    function move($source,$destination,$overwrite=false){
     
    281282            return @ftp_rmdir($this->link,$file);
    282283        $filelist = $this->dirlist($file);
    283         foreach ($filelist as $filename => $fileinfo) {
     284        foreach ((array) $filelist as $filename => $fileinfo) {
    284285            $this->delete($file.'/'.$filename,$recursive);
    285286        }
     
    328329            return false;
    329330        if( $chmod )
    330             $this->chmod($chmod);
     331            $this->chmod($path, $chmod);
    331332        if( $chown )
    332             $this->chown($chown);
     333            $this->chown($path, $chown);
    333334        if( $chgrp )
    334             $this->chgrp($chgrp);
     335            $this->chgrp($path, $chgrp);
    335336        return true;
    336337    }
     
    344345           
    345346    }
     347
     348    function parselisting($line) {
     349        $is_windows = ($this->OS_remote == FTP_OS_Windows);
     350        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)) {
     351            $b = array();
     352            if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
     353            $b['isdir'] = ($lucifer[7]=="<DIR>");
     354            if ( $b['isdir'] )
     355                $b['type'] = 'd';
     356            else
     357                $b['type'] = 'f';
     358            $b['size'] = $lucifer[7];
     359            $b['month'] = $lucifer[1];
     360            $b['day'] = $lucifer[2];
     361            $b['year'] = $lucifer[3];
     362            $b['hour'] = $lucifer[4];
     363            $b['minute'] = $lucifer[5];
     364            $b['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);
     365            $b['am/pm'] = $lucifer[6];
     366            $b['name'] = $lucifer[8];
     367        } else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) {
     368            //echo $line."\n";
     369            $lcount=count($lucifer);
     370            if ($lcount<8) return '';
     371            $b = array();
     372            $b['isdir'] = $lucifer[0]{0} === "d";
     373            $b['islink'] = $lucifer[0]{0} === "l";
     374            if ( $b['isdir'] )
     375                $b['type'] = 'd';
     376            elseif ( $b['islink'] )
     377                $b['type'] = 'l';
     378            else
     379                $b['type'] = 'f';
     380            $b['perms'] = $lucifer[0];
     381            $b['number'] = $lucifer[1];
     382            $b['owner'] = $lucifer[2];
     383            $b['group'] = $lucifer[3];
     384            $b['size'] = $lucifer[4];
     385            if ($lcount==8) {
     386                sscanf($lucifer[5],"%d-%d-%d",$b['year'],$b['month'],$b['day']);
     387                sscanf($lucifer[6],"%d:%d",$b['hour'],$b['minute']);
     388                $b['time'] = @mktime($b['hour'],$b['minute'],0,$b['month'],$b['day'],$b['year']);
     389                $b['name'] = $lucifer[7];
     390            } else {
     391                $b['month'] = $lucifer[5];
     392                $b['day'] = $lucifer[6];
     393                if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) {
     394                    $b['year'] = date("Y");
     395                    $b['hour'] = $l2[1];
     396                    $b['minute'] = $l2[2];
     397                } else {
     398                    $b['year'] = $lucifer[7];
     399                    $b['hour'] = 0;
     400                    $b['minute'] = 0;
     401                }
     402                $b['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute']));
     403                $b['name'] = $lucifer[8];
     404            }
     405        }
     406
     407        return $b;
     408    }
     409
    346410    function dirlist($path='.',$incdot=false,$recursive=false){
    347411        if( $this->is_file($path) ){
     
    353417        //if( ! $this->is_dir($path) )
    354418        //  return false;
    355         $list = ftp_rawlist($this->link,$path,false); //We'll do the recursive part ourseves...
    356         //var_dump($list);
    357         if( ! $list )
    358             return false;
    359         if( empty($list) )
     419        $list = ftp_rawlist($this->link , '-a ' . $path, false);
     420        if ( $list === false )
     421            return false;
     422
     423        $dirlist = array();
     424        foreach ( $list as $k => $v ) {
     425            $entry = $this->parselisting($v);
     426            if ( empty($entry) )
     427                continue;
     428
     429            if ( $entry["name"]=="." or $entry["name"]==".." )
     430                continue;
     431
     432            $dirlist[$entry['name']] = $entry;
     433        }
     434
     435        if ( ! $dirlist )
     436            return false;
     437        if ( empty($dirlist) )
    360438            return array();
    361439
    362440        $ret = array();
    363         foreach($list as $line){
    364             if (substr(strtolower($line), 0, 5) == 'total') continue;
    365             $struc = array();
    366             $current = preg_split("/[\s]+/",$line,9);
    367             $name_num = count($current) - 1;
    368             $struc['name']      = str_replace('//','',$current[$name_num]);
    369 
    370             if( '.' == $struc['name'][0] && !$incdot)
    371                 continue;
    372             if( $limitFile && $struc['name'] != $limitFile)
    373                 continue;
    374 
    375             $struc['perms']     = $current[0];
    376             $struc['permsn']    = $this->getnumchmodfromh($current[0]);
    377             $struc['number']    = $current[1];
    378             $struc['owner']     = $current[2];
    379             $struc['group']     = $current[3];
    380             $struc['size']      = $current[4];
    381             $struc['lastmod']   = $current[5].' '.$current[6];
    382             $struc['time']      = $current[7];
    383 
    384             $struc['type']      = ('d' == $struc['perms'][0] || 'l' == $struc['perms'][0] ) ? 'folder' : 'file';
    385             if('folder' == $struc['type'] ){
     441        foreach ( $dirlist as $struc ) {
     442           
     443            if ( 'd' == $struc['type'] ) {
    386444                $struc['files'] = array();
    387445
    388                 if( $incdot ){
     446                if ( $incdot ){
    389447                    //We're including the doted starts
    390448                    if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder
     
    402460        return $ret;
    403461    }
     462
    404463    function __destruct(){
    405464        if( $this->link )
  • trunk/wp-admin/includes/class-wp-filesystem-ftpsockets.php

    r7033 r7126  
    3030        if( ! @include_once ABSPATH . 'wp-admin/includes/class-ftp.php' )
    3131                return false;
    32         $this->ftp = new FTP();
     32        $this->ftp = new ftp();
    3333
    3434        //Set defaults:
     
    6161        if ( ! $this->ftp )
    6262            return false;
    63            
    64         if ( ! $this->ftp->connect($this->options['hostname'], $this->options['port'], $this->timeout) ) {
     63
     64        //$this->ftp->Verbose = true;
     65
     66        if ( ! $this->ftp->SetServer($this->options['hostname'], $this->options['port']) ) {
     67            $this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port']));
     68            return false;
     69        }
     70        if ( ! $this->ftp->connect() ) {
    6571            $this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port']));
    6672            return false;
     
    7278        }
    7379
     80        $this->ftp->SetType(FTP_AUTOASCII);
     81        $this->ftp->Passive(true);
    7482        return true;
    7583    }
     
    114122        return $this->find_base_dir('/',$echo);
    115123    }
     124
    116125    function get_base_dir($base = '.'){
    117126        if( empty($this->wp_base) )
     
    119128        return $this->wp_base;
    120129    }
     130
    121131    function get_contents($file,$type='',$resumepos=0){
    122132        if( empty($type) ){
     
    125135        }
    126136        $this->ftp->SetType($type);
    127        
    128         return $this->ftp->get($file);
    129     }
     137        $temp = tmpfile();
     138        if ( ! $this->ftp->fget($temp, $file) ) {
     139            fclose($temp);
     140            return false;
     141        }
     142        fseek($temp, 0); //Skip back to the start of the file being written to
     143        $contents = '';
     144        while ( !feof($temp) )
     145            $contents .= fread($temp, 8192);
     146        fclose($temp);
     147        return $contents;
     148    }
     149
    130150    function get_contents_array($file){
    131151        return explode("\n",$this->get_contents($file));
    132152    }
     153
    133154    function put_contents($file,$contents,$type=''){
    134155        if( empty($type) ){
    135             $extension = substr(strrchr($filename, "."), 1);
     156            $extension = substr(strrchr($file, "."), 1);
    136157            $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII;
    137158        }
     
    141162        fwrite($temp,$contents);
    142163        fseek($temp, 0); //Skip back to the start of the file being written to
    143         $ret = $this->ftp->put($temp, $file);
     164        $ret = $this->ftp->fput($file, $temp);
    144165        fclose($temp);
    145166        return $ret;
    146167    }
     168
    147169    function cwd(){
    148170        return $this->ftp->pwd();
    149171    }
     172
    150173    function chgrp($file,$group,$recursive=false){
    151174        return false;
    152175    }
     176   
    153177    function chmod($file,$mode=false,$recursive=false){
    154178        if( ! $mode )
     
    168192        return true;
    169193    }
     194   
    170195    function chown($file,$owner,$recursive=false){
    171196        return false;
    172197    }
     198   
    173199    function owner($file){
    174200        $dir = $this->dirlist($file);
    175201        return $dir[$file]['owner'];
    176202    }
     203   
    177204    function getchmod($file){
    178205        $dir = $this->dirlist($file);
    179206        return $dir[$file]['permsn'];
    180207    }
     208
    181209    function gethchmod($file){
    182210        //From the PHP.net page for ...?
     
    230258        return $info;
    231259    }
     260
    232261    function getnumchmodfromh($mode) {
    233262        $realmode = "";
     
    248277        return $newmode;
    249278    }
     279
    250280    function group($file){
    251281        $dir = $this->dirlist($file);
    252282        return $dir[$file]['group'];
    253283    }
     284
    254285    function copy($source,$destination,$overwrite=false){
    255286        if( ! $overwrite && $this->exists($destination) )
    256287            return false;
     288
    257289        $content = $this->get_contents($source);
    258         $this->put_contents($destination,$content);
    259     }
     290        if ( !$content )
     291            return false;
     292
     293        return $this->put_contents($destination,$content);
     294    }
     295
    260296    function move($source,$destination,$overwrite=false){
    261297        return $this->ftp->rename($source,$destination);
     
    267303        if ( !$recursive )
    268304            return $this->ftp->rmdir($file);
    269         $filelist = $this->dirlist($file);
    270         foreach ($filelist as $filename) {
    271             $this->delete($file.'/'.$filename,$recursive);
    272         }
    273         return $this->ftp->rmdir($file);
     305
     306        return $this->ftp->mdel($file);
    274307    }
    275308
     
    277310        return $this->ftp->is_exists($file);
    278311    }
     312
    279313    function is_file($file){
    280         //return $this->ftp->file_exists($file);
    281         $list = $this->ftp->rawlist($file,'-a');
    282         if( ! $list )
    283             return false;
    284         return ($list[0] == '-');
    285     }
     314        return $this->is_dir($file) ? false : true;
     315    }
     316
    286317    function is_dir($path){
    287         $list = $this->ftp->rawlist($file,'-a');
    288         if( ! $list )
    289             return false;
    290         return true;
    291     }
     318        $cwd = $this->cwd();
     319        if ( $this->ftp->chdir($path) ) {
     320            $this->ftp->chdir($cwd);
     321            return true;
     322        }
     323        return false;
     324    }
     325
    292326    function is_readable($file){
    293327        //Get dir list, Check if the file is writable by the current user??
    294328        return true;
    295329    }
     330
    296331    function is_writable($file){
    297332        //Get dir list, Check if the file is writable by the current user??
    298333        return true;
    299334    }
     335
    300336    function atime($file){
    301337        return false;
    302338    }
     339
    303340    function mtime($file){
    304341        return $this->ftp->mdtm($file);
    305342    }
     343
    306344    function size($file){
    307345        return $this->ftp->filesize($file);
    308346    }
     347
    309348    function touch($file,$time=0,$atime=0){
    310349        return false;
    311350    }
     351
    312352    function mkdir($path,$chmod=false,$chown=false,$chgrp=false){
    313353        if( ! $this->ftp->mkdir($path) )
    314354            return false;
    315355        if( $chmod )
    316             $this->chmod($chmod);
     356            $this->chmod($path, $chmod);
    317357        if( $chown )
    318             $this->chown($chown);
     358            $this->chown($path, $chown);
    319359        if( $chgrp )
    320             $this->chgrp($chgrp);
     360            $this->chgrp($path, $chgrp);
    321361        return true;
    322362    }
     363
    323364    function rmdir($path,$recursive=false){
    324365        if( ! $recursive )
    325366            return $this->ftp->rmdir($file);
    326         return false;
    327         //TODO: Recursive Directory delete, Have to delete files from the folder first.
    328         //$dir = $this->dirlist($path);
    329         //foreach($dir as $file)
    330            
    331     }
     367
     368        return $this->ftp->mdel($path);
     369    }
     370
    332371    function dirlist($path='.',$incdot=false,$recursive=false){
    333372        if( $this->is_file($path) ){
     
    339378        //if( ! $this->is_dir($path) )
    340379        //  return false;
    341         $list = $this->ftp->rawlist($path,'-a');
    342         //var_dump($list);
     380        $list = $this->ftp->dirlist($path);
    343381        if( ! $list )
    344382            return false;
     
    347385
    348386        $ret = array();
    349         foreach($list as $line){
    350             $struc = array();
    351             $current = preg_split("/[\s]+/",$line,9);
    352             $struc['name']      = str_replace('//','',$current[8]);
    353 
    354             if( '.' == $struc['name'][0] && !$incdot)
    355                 continue;
    356             if( $limitFile && $struc['name'] != $limitFile)
    357                 continue;
    358 
    359             $struc['perms']     = $current[0];
    360             $struc['permsn']    = $this->getnumchmodfromh($current[0]);
    361             $struc['number']    = $current[1];
    362             $struc['owner']     = $current[2];
    363             $struc['group']     = $current[3];
    364             $struc['size']      = $current[4];
    365             $struc['lastmod']   = $current[5].' '.$current[6];
    366             $struc['time']      = $current[7];
    367 
    368             $struc['type']      = ('d' == $struc['perms'][0] || 'l' == $struc['perms'][0] ) ? 'folder' : 'file';
    369             if('folder' == $struc['type'] ){
     387        foreach ( $list as $struc ) {
     388           
     389            if ( 'd' == $struc['type'] ) {
    370390                $struc['files'] = array();
    371391
    372                 if( $incdot ){
     392                if ( $incdot ){
    373393                    //We're including the doted starts
    374394                    if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder
     
    386406        return $ret;
    387407    }
     408
    388409    function __destruct(){
    389410        $this->ftp->quit();
  • trunk/wp-admin/includes/file.php

    r7058 r7126  
    238238    $tmppath = '';
    239239    for ( $j = 0; $j < count($path) - 1; $j++ ) {
     240        $prevpath = $tmppath;
    240241        $tmppath .= $path[$j] . '/';
    241242        if ( ! $fs->is_dir($tmppath) ) {
    242             $fs->mkdir($tmppath);
    243         } else {
    244             $fs->setDefaultPermissions( $fs->getchmod($tmppath) );
     243            //$fs->setDefaultPermissions( $fs->getchmod($tmppath) );
     244            $fs->mkdir($tmppath, 0755);
    245245        }
    246246    }
     
    254254            $tmppath .= $path[$j] . '/';
    255255            if ( ! $fs->is_dir($to . $tmppath) )
    256                 $fs->mkdir($to . $tmppath);
     256                if ( !$fs->mkdir($to . $tmppath, 0755) )
     257                    return new WP_Error('mkdir_failed', __('Could not create directory'));
    257258        }
    258259
    259260        // We've made sure the folders are there, so let's extract the file now:
    260261        if ( ! $file['folder'] )
    261             $fs->put_contents( $to . $file['filename'], $file['content']);
    262     }
     262            if ( !$fs->put_contents( $to . $file['filename'], $file['content']) )
     263                return new WP_Error('copy_failed', __('Could not copy file'));
     264            $fs->chmod($to . $file['filename'], 0644);
     265    }
     266
     267    return true;
    263268}
    264269
     
    272277
    273278    foreach ( (array) $dirlist as $filename => $fileinfo ) {
    274         if ( 'file' == $fileinfo['type'] ) {
    275             $wp_filesystem->copy($from . $filename, $to . $filename, true);
    276         } elseif ( 'folder' == $fileinfo['type'] ) {
    277             $wp_filesystem->mkdir($to . $filename);
    278             copy_dir($from . $filename, $to . $filename);
     279        if ( 'f' == $fileinfo['type'] ) {
     280            if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true) )
     281                return false;
     282            $wp_filesystem->chmod($to . $filename, 0644);
     283        } elseif ( 'd' == $fileinfo['type'] ) {
     284            if ( !$wp_filesystem->mkdir($to . $filename, 0755) )
     285                return false;
     286            if ( !copy_dir($from . $filename, $to . $filename) )
     287                return false;
    279288        }
    280289    }
     290
     291    return true;
    281292}
    282293
     
    303314
    304315function get_filesystem_method() {
     316    return 'ftpsockets';
     317
    305318    $tempFile = tempnam(get_temp_dir(), 'WPU');
    306319
    307320    if ( getmyuid() == fileowner($tempFile) ) {
    308321        unlink($tempFile);
    309         //return 'direct';
     322        return 'direct';
    310323    } else {
    311324        unlink($tempFile);
  • trunk/wp-admin/includes/update.php

    r7076 r7126  
    159159
    160160    // Clean up working directory
    161     $wp_filesystem->delete($working_dir, true);
     161    if ( is_dir($working_dir) )
     162        $wp_filesystem->delete($working_dir, true);
    162163
    163164    apply_filters('update_feedback', __("Unpacking the update"));
     
    175176    // Remove the existing plugin.
    176177    apply_filters('update_feedback', __("Removing the old version of the plugin"));
    177     $wp_filesystem->delete(ABSPATH . PLUGINDIR . "/$plugin");
    178178    $plugin_dir = dirname(ABSPATH . PLUGINDIR . "/$plugin");
    179 
    180179    // If plugin is in its own directory, recursively delete the directory.
    181180    if ( '.' != $plugin_dir && ABSPATH . PLUGINDIR != $plugin_dir )
    182         $wp_filesystem->delete($plugin_dir, true);
     181        $deleted = $wp_filesystem->delete($plugin_dir, true);
     182    else
     183        $deleted = $wp_filesystem->delete(ABSPATH . PLUGINDIR . "/$plugin");
     184    if ( !$deleted ) {
     185        $wp_filesystem->delete($working_dir, true);
     186        return new WP_Error('delete_failed', __('Could not remove the old plugin'));
     187    }
    183188
    184189    apply_filters('update_feedback', __("Installing the latest version"));
    185190    // Copy new version of plugin into place.
    186     copy_dir($working_dir, ABSPATH . PLUGINDIR);
     191    if ( !copy_dir($working_dir, ABSPATH . PLUGINDIR) ) {
     192        //$wp_filesystem->delete($working_dir, true);
     193        return new WP_Error('install_failed', __('Installation failed'));
     194    }
    187195
    188196    // Remove working directory
Note: See TracChangeset for help on using the changeset viewer.