Вход Регистрация
Файл: upload/include/library/phpfox/ftp/ftp.class.php
Строк: 231
<?php
/**
 * [PHPFOX_HEADER]
 */

defined('PHPFOX') or exit('NO DICE!');

/**
 * Handles FTP (File Transfer Protocol).
 * We mainly use this in the AdminCP to make things easier on Admins to upload new
 * plug-ins or themes without the need to open an FTP client and instead upload a archive
 * and with the access details provided we can use FTP commands to do tasks which normally
 * cant be done via HTTP.
 *
 * Example:
 * <code>
 * // Connect to the FTP server
 * Phpfox::getLib('ftp')->connect('192.168.0.2', 'user', 'pass');
 * 
 * // Upload a file tot he server
 * Phpfox::getLib('ftp')->put('/var/www/sample.jpg', '/home/site/public_html/sample.jpg');
 * </code>
 * 
 * @link http://php.net/manual/en/book.ftp.php
 * @copyright        [PHPFOX_COPYRIGHT]
 * @author          Raymond Benc
 * @package         Phpfox
 * @version         $Id: $
 */
class Phpfox_Ftp
{
    
/**
     * Holds FTP resource
     *
     * @see ftp_connect()
     * @see self::__construct()
     * @var resource
     */
    
private $_oFtp = null;
    
    
/**
     * Class constructor. Connects to FTP server.
     *
     * @return mixed Returns TRUE on success, FALSE on failure and NULL if we are to skip the login.
     */
    
public function __construct()
    {
        if (
defined('PHPFOX_FTP_LOGIN_PASS'))
        {
            return;    
        }
        
        
// Connect to FTP host
        
if (!($this->_oFtp = ftp_connect(Phpfox::getParam('core.ftp_host'))))
        {
            return 
Phpfox_Error::set(Phpfox::getPhrase('core.unable_to_connect_to_ftp_host'));
        }
        
        
// Get FTP password, hash and password with the hash
        
$sPassword = Phpfox::getParam('core.ftp_password');        
        
$sHash = substr(base64_decode(base64_decode($sPassword)), -32);
        
$sPassword = substr_replace(base64_decode(base64_decode($sPassword)), '', -32);
        
        
// Make sure the password has match the server hash
        
if (md5(Phpfox::getParam('core.salt')) != $sHash)
        {
            return 
Phpfox_Error::set(Phpfox::getPhrase('core.ftp_password_hash_does_not_match_with_server_hash'));
        }        
        
        
// Login with FTP credentials
        
if (!ftp_login($this->_oFtp, Phpfox::getParam('core.ftp_username'), $sPassword))
        {
            return 
Phpfox_Error::set(Phpfox::getPhrase('core.unable_to_login_to_ftp_server'));
        }        
    }
    
    
/**
     * Performs a connection to a FTP server
     *
     * @see ftp_connect()
     * @see ftp_login()
     * @param string $sHost Host to connect to
     * @param string $sUsername User name to use to log into the server
     * @param string $sPassword Password to use to log into the server
     * @return bool TRUE on success, FALSE on failure
     */
    
public function connect($sHost, $sUsername, $sPassword)
    {
        
Phpfox_Error::skip(true);
        if (!(
$this->_oFtp = ftp_connect($sHost)))
        {
            return 
Phpfox_Error::set(Phpfox::getPhrase('core.unable_to_connect_to_ftp_host'));
        }        
        
        if (!
ftp_login($this->_oFtp, $sUsername, $sPassword))
        {
            return 
Phpfox_Error::set(Phpfox::getPhrase('core.unable_to_login_to_ftp_server'));
        }    
        
Phpfox_Error::skip(false);    
        
        return 
true;
    }
    
    
/**
     * Tests the current directory if this is where phpFox is installed.
     *
     * @param mixed $sPage NULL is passed by default and we then find the base directory, however if you know where phpFox is installed you can pass the full path here.
     * @return bool TRUE if we found phpFox, and FALSE if we didn't
     */
    
public function test($sPage = null)
    {
        
Phpfox_Error::skip(true);
        
$aList = ftp_nlist($this->_oFtp, ($sPage === null ? $this->getPath() : $sPage) . 'include' . PHPFOX_DS . 'library' . PHPFOX_DS . 'phpfox');
        
Phpfox_Error::skip(false);
        
        if ((!
is_array($aList)) || (is_array($aList) && !count($aList)))
        {
            return 
Phpfox_Error::set(Phpfox::getPhrase('core.unable_to_connect_to_ftp_base_directory_make_sure_the_setting_for_ftp_directory_path_has_the_correct_path'));
        }
        
        return 
true;
    }    
    
    
/**
     * Uploads a file from your computer to the server.
     *
     * @see ftp_put()
     * @param string $sOld Full path to the file on your computer
     * @param string $sNew Full path to where to place the file on the server
     * @return bool TRUE on success, FALSE on failure
     */
    
public function put($sOld, $sNew)
    {        
        
$cType = FTP_ASCII;
        if (
preg_match('/^(.*?).(gif|jpg|jpeg|png)$/i', $sNew))
        {
            
$cType = FTP_BINARY;
        }
        
        if (!
ftp_put($this->_oFtp, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sNew), str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sOld), $cType))
        {
            return 
Phpfox_Error::trigger('Unable to move file ' . str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sNew) . ' to ' . str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sOld) . '.', E_USER_ERROR);
        }
        
        if (
strtolower(PHP_OS) == 'linux')
        {
            
ftp_chmod($this->_oFtp, 0644, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sNew));
        }        
        
        return 
true;
    }
    
    
/**
     * Moves a file from one location to another on the FTP server.
     *
     * @see ftp_rename()
     * @param string $sOld Full path to the file we are going to move
     * @param string $sNew Full path to where we are going to place the file
     * @return bool TRUE on success, FALSE on failure
     */
    
public function move($sOld, $sNew)
    {        
        
// Use ftp_rename to move the item
        
if (!ftp_rename($this->_oFtp, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sOld), str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sNew)))
        {            
            return 
Phpfox_Error::trigger('Unable to move file ' . str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sOld) . ' to ' . str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sNew) . '.', E_USER_ERROR);
        }
        
        return 
true;
    }
    
    
/**
     * Changes permission on a file/folder
     *
     * @see ftp_chmod()
     * @param string $sFile Full path to the file we are working with
     * @param string $iPerm Permission to change the file to
     */
    
public function chmod($sFile, $iPerm)
    {
        
ftp_chmod($this->_oFtp, $iPerm, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sFile));
    }
    
    
/**
     * Makes a directory on the server. There is also support to make directories recursively.
     *
     * @see ftp_mkdir()
     * @param string $sDir Full path to the directory to create
     * @param bool $bRecurse TRUE will recursively create directories based on the full path and FALSE will not
     */
    
public function mkdir($sDir, $bRecurse = false)
    {        
        if (
$bRecurse === true)
        {            
            
$aParts = explode(PHPFOX_DS, trim($sDir, PHPFOX_DS));
            
$sParentDirectory = PHPFOX_DS;
            foreach (
$aParts as $sDir)
            {
                if (!
is_dir($sParentDirectory . $sDir))
                {
                    
ftp_mkdir($this->_oFtp, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sParentDirectory) . $sDir);
                    if (
strtolower(PHP_OS) == 'linux')
                    {
                        
ftp_chmod($this->_oFtp, 0755, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sParentDirectory) . $sDir);
                    }
                }                
                
                
$sParentDirectory .= $sDir . PHPFOX_DS;
            }            
        }
        else 
        {            
            
$sDir = str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sDir);
            
ftp_mkdir($this->_oFtp, $sDir);
            if (
strtolower(PHP_OS) == 'linux')
            {
                
ftp_chmod($this->_oFtp, 0755, $sDir);
            }
        }
    }
    
    
/**
     * Deletes a file on the FTP server
     *
     * @see ftp_delete()
     * @param string $sFile Full path of the file to delete.
     * @return bool TRUE on success, FALSE on failure
     */
    
public function unlink($sFile)
    {
        return 
ftp_delete($this->_oFtp, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sFile));
    }
    
    
/**
     * Removes a directory from the FTP server
     *
     * @param string $sPath Full path to the directory we should remove
     * @return bool TRUE on success, FALSE on failure
     */
    
public function rmdir($sPath)
    {        
        if (!
file_exists($sPath))
        {
            return 
true;
        }
        
        if (
is_file($sPath))
        {
            return 
ftp_delete($this->_oFtp, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sPath));
        }
        
        foreach (
scandir($sPath) as $sItem)
        {            
            if (
$sItem == '.' || $sItem == '..')
            {
                continue;
            }
            
            if (
is_dir($sPath . PHPFOX_DS . $sItem))
            {            
                
$this->rmdir($sPath . PHPFOX_DS . $sItem);                
            }
            else
            {        
                if (
is_dir($sPath . PHPFOX_DS . $sItem))
                {
                    
ftp_rmdir($this->_oFtp, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sPath) . PHPFOX_DS . $sItem);
                }
                else 
                {
                    
ftp_delete($this->_oFtp, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sPath) . PHPFOX_DS . $sItem);
                }
            }
        }
        
        return 
ftp_rmdir($this->_oFtp, str_replace(PHPFOX_DIR, Phpfox::getParam('core.ftp_dir_path'), $sPath));
    }

    
/**
     * Try to find the full path of where we are currently located based on the relative position
     * we are allowed to access on the FTP server.
     *
     * @return mixed FALSE if we cannot find where we are, STRING if we can; which is the full path to where we are
     */
    
public function getPath()
    {
        
Phpfox_Error::skip(true);
        if (
ftp_chdir($this->_oFtp, PHPFOX_DIR))
        {
            return 
'';
        }
        
Phpfox_Error::skip(false);
        
        
$sCurrentDirectory = ftp_pwd($this->_oFtp);
        
        
$aCache = array();
        
$aParts = explode(PHPFOX_DS, PHPFOX_DIR);
        foreach (
$aParts as $sPart)
        {
            if (empty(
$sPart))
            {
                continue;
            }
            
            
$aCache[$sPart] = true;
        }        
        
        
$sBase = '';
        
$aList = ftp_nlist($this->_oFtp, '.');
        foreach (
$aList as $sList)
        {
            if (
$sList == '.' || $sList == '..')
            {
                continue;
            }

            
$sList = trim($sList, '.');
            
$sList = trim($sList, '/');
            
$sList = trim($sList, '/');
            
            if (isset(
$aCache[$sList]))
            {
                
$sBase = $sList;
                break;
            }
        }        
        
        if (!empty(
$sBase))
        {
            
$aBaseParts = explode($sBase, PHPFOX_DIR);            
            
            return 
PHPFOX_DS . $sBase . $aBaseParts[1];
        }
        
        return 
false;
    }
}

?>
Онлайн: 1
Реклама