mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-06 18:21:39 +09:00
Delete ability to install or update third-party software via FTP/SFTP
This commit is contained in:
parent
215f143e70
commit
49b95477b0
8 changed files with 19 additions and 632 deletions
|
|
@ -313,580 +313,6 @@ class ModuleInstaller
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Module installer for SFTP
|
||||
* @author NAVER (developers@xpressengine.com)
|
||||
*/
|
||||
class SFTPModuleInstaller extends ModuleInstaller
|
||||
{
|
||||
|
||||
/**
|
||||
* FTP information
|
||||
* @var object
|
||||
*/
|
||||
var $ftp_info = NULL;
|
||||
|
||||
/**
|
||||
* SFTP connection
|
||||
* @var resource
|
||||
*/
|
||||
var $connection = NULL;
|
||||
|
||||
/**
|
||||
* SFTP resource
|
||||
* @var resource
|
||||
*/
|
||||
var $sftp = NULL;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param object $package Package information
|
||||
* @return void
|
||||
*/
|
||||
function __construct(&$package)
|
||||
{
|
||||
$this->package = &$package;
|
||||
$this->ftp_info = Context::getFTPInfo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect to SFTP
|
||||
*
|
||||
* @return Object
|
||||
*/
|
||||
function _connect()
|
||||
{
|
||||
if(!function_exists('ssh2_connect'))
|
||||
{
|
||||
return new BaseObject(-1, 'msg_sftp_not_supported');
|
||||
}
|
||||
|
||||
if(!$this->ftp_info->ftp_user || !$this->ftp_info->sftp || $this->ftp_info->sftp != 'Y')
|
||||
{
|
||||
return new BaseObject(-1, 'msg_ftp_invalid_auth_info');
|
||||
}
|
||||
|
||||
if($this->ftp_info->ftp_host)
|
||||
{
|
||||
$ftp_host = $this->ftp_info->ftp_host;
|
||||
}
|
||||
else
|
||||
{
|
||||
$ftp_host = "127.0.0.1";
|
||||
}
|
||||
$this->connection = ssh2_connect($ftp_host, $this->ftp_info->ftp_port);
|
||||
if(!@ssh2_auth_password($this->connection, $this->ftp_info->ftp_user, $this->ftp_password))
|
||||
{
|
||||
return new BaseObject(-1, 'msg_ftp_invalid_auth_info');
|
||||
}
|
||||
$_SESSION['ftp_password'] = $this->ftp_password;
|
||||
$this->sftp = ssh2_sftp($this->connection);
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Close
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function _close()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove file
|
||||
*
|
||||
* @param string $path Path to remove
|
||||
* @return Object
|
||||
*/
|
||||
function _removeFile($path)
|
||||
{
|
||||
if(substr($path, 0, 2) == "./")
|
||||
{
|
||||
$path = substr($path, 2);
|
||||
}
|
||||
$target_path = $this->ftp_info->ftp_root_path . $path;
|
||||
|
||||
if(!@ssh2_sftp_unlink($this->sftp, $target_path))
|
||||
{
|
||||
return new BaseObject(-1, sprintf(lang('msg_delete_file_failed'), $path));
|
||||
}
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove Directory
|
||||
*
|
||||
* @param string $path Path to remove
|
||||
* @return Object
|
||||
*/
|
||||
function _removeDir_real($path)
|
||||
{
|
||||
if(substr($path, 0, 2) == "./")
|
||||
{
|
||||
$path = substr($path, 2);
|
||||
}
|
||||
$target_path = $this->ftp_info->ftp_root_path . $path;
|
||||
|
||||
if(!@ssh2_sftp_rmdir($this->sftp, $target_path))
|
||||
{
|
||||
return new BaseObject(-1, sprintf(lang('msg_delete_dir_failed'), $path));
|
||||
}
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy directory
|
||||
*
|
||||
* @param array $file_list File list to copy
|
||||
* @return Object
|
||||
*/
|
||||
function _copyDir(&$file_list)
|
||||
{
|
||||
if(!$this->ftp_password)
|
||||
{
|
||||
return new BaseObject(-1, 'msg_ftp_password_input');
|
||||
}
|
||||
|
||||
$output = $this->_connect();
|
||||
if(!$output->toBool())
|
||||
{
|
||||
return $output;
|
||||
}
|
||||
$target_dir = $this->ftp_info->ftp_root_path . $this->target_path;
|
||||
$copied = array();
|
||||
|
||||
if(is_array($file_list))
|
||||
{
|
||||
foreach($file_list as $k => $file)
|
||||
{
|
||||
$org_file = $file;
|
||||
if($this->package->path == ".")
|
||||
{
|
||||
$file = substr($file, 3);
|
||||
}
|
||||
$path = FileHandler::getRealPath("./" . $this->target_path . "/" . $file);
|
||||
$pathname = dirname($target_dir . "/" . $file);
|
||||
|
||||
if(!file_exists(FileHandler::getRealPath($real_path)))
|
||||
{
|
||||
ssh2_sftp_mkdir($this->sftp, $pathname, 0755, TRUE);
|
||||
}
|
||||
|
||||
ssh2_scp_send($this->connection, FileHandler::getRealPath($this->download_path . "/" . $org_file), $target_dir . "/" . $file);
|
||||
$copied[] = $path;
|
||||
}
|
||||
}
|
||||
|
||||
FileHandler::clearStatCache($copied, true);
|
||||
FileHandler::invalidateOpcache($copied);
|
||||
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Module installer for PHP FTP
|
||||
* @author NAVER (developers@xpressengine.com)
|
||||
*/
|
||||
class PHPFTPModuleInstaller extends ModuleInstaller
|
||||
{
|
||||
|
||||
/**
|
||||
* FTP information
|
||||
* @var object
|
||||
*/
|
||||
var $ftp_info = NULL;
|
||||
|
||||
/**
|
||||
* FTP connection
|
||||
* @var resource
|
||||
*/
|
||||
var $connection = NULL;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param object $package Package information
|
||||
* @var void
|
||||
*/
|
||||
function __construct(&$package)
|
||||
{
|
||||
$this->package = &$package;
|
||||
$this->ftp_info = Context::getFTPInfo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect to FTP
|
||||
*
|
||||
* @return Object
|
||||
*/
|
||||
function _connect()
|
||||
{
|
||||
if($this->ftp_info->ftp_host)
|
||||
{
|
||||
$ftp_host = $this->ftp_info->ftp_host;
|
||||
}
|
||||
else
|
||||
{
|
||||
$ftp_host = "127.0.0.1";
|
||||
}
|
||||
|
||||
$this->connection = ftp_connect($ftp_host, $this->ftp_info->ftp_port);
|
||||
if(!$this->connection)
|
||||
{
|
||||
return new BaseObject(-1, sprintf(lang('msg_ftp_not_connected'), 'host'));
|
||||
}
|
||||
|
||||
$login_result = @ftp_login($this->connection, $this->ftp_info->ftp_user, $this->ftp_password);
|
||||
if(!$login_result)
|
||||
{
|
||||
$this->_close();
|
||||
return new BaseObject(-1, 'msg_ftp_invalid_auth_info');
|
||||
}
|
||||
|
||||
$_SESSION['ftp_password'] = $this->ftp_password;
|
||||
if($this->ftp_info->ftp_pasv != "N")
|
||||
{
|
||||
ftp_pasv($this->connection, TRUE);
|
||||
}
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove file
|
||||
*
|
||||
* @param string $path Path to remove
|
||||
* @return Object
|
||||
*/
|
||||
function _removeFile($path)
|
||||
{
|
||||
if(substr($path, 0, 2) == "./")
|
||||
{
|
||||
$path = substr($path, 2);
|
||||
}
|
||||
$target_path = $this->ftp_info->ftp_root_path . $path;
|
||||
|
||||
if(!@ftp_delete($this->connection, $target_path))
|
||||
{
|
||||
return new BaseObject(-1, "failed to delete file " . $path);
|
||||
}
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove directory
|
||||
*
|
||||
* @param string $path Path to remove
|
||||
* @return Object
|
||||
*/
|
||||
function _removeDir_real($path)
|
||||
{
|
||||
if(substr($path, 0, 2) == "./")
|
||||
{
|
||||
$path = substr($path, 2);
|
||||
}
|
||||
$target_path = $this->ftp_info->ftp_root_path . $path;
|
||||
|
||||
if(!@ftp_rmdir($this->connection, $target_path))
|
||||
{
|
||||
return new BaseObject(-1, "failed to delete directory " . $path);
|
||||
}
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Close
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function _close()
|
||||
{
|
||||
ftp_close($this->connection);
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy directory
|
||||
*
|
||||
* @param array $file_list File list to copy
|
||||
* @return Object
|
||||
*/
|
||||
function _copyDir(&$file_list)
|
||||
{
|
||||
if(!$this->ftp_password)
|
||||
{
|
||||
return new BaseObject(-1, 'msg_ftp_password_input');
|
||||
}
|
||||
|
||||
$output = $this->_connect();
|
||||
if(!$output->toBool())
|
||||
{
|
||||
return $output;
|
||||
}
|
||||
|
||||
if(!$this->target_path)
|
||||
{
|
||||
$this->target_path = '.';
|
||||
}
|
||||
if(substr($this->download_path, -1) == '/')
|
||||
{
|
||||
$this->download_path = substr($this->download_path, 0, -1);
|
||||
}
|
||||
$target_dir = $this->ftp_info->ftp_root_path . $this->target_path;
|
||||
$copied = array();
|
||||
|
||||
if(is_array($file_list))
|
||||
{
|
||||
foreach($file_list as $k => $file)
|
||||
{
|
||||
if(!$file)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
$org_file = $file;
|
||||
if($this->package->path == ".")
|
||||
{
|
||||
$file = substr($file, 3);
|
||||
}
|
||||
$path = FileHandler::getRealPath("./" . $this->target_path . "/" . $file);
|
||||
$path_list = explode('/', dirname($this->target_path . "/" . $file));
|
||||
|
||||
$real_path = "./";
|
||||
$ftp_path = $this->ftp_info->ftp_root_path;
|
||||
|
||||
for($i = 0; $i < count($path_list); $i++)
|
||||
{
|
||||
if($path_list == "")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
$real_path .= $path_list[$i] . "/";
|
||||
$ftp_path .= $path_list[$i] . "/";
|
||||
if(!file_exists(FileHandler::getRealPath($real_path)))
|
||||
{
|
||||
if(!@ftp_mkdir($this->connection, $ftp_path))
|
||||
{
|
||||
return new BaseObject(-1, "msg_make_directory_failed");
|
||||
}
|
||||
|
||||
if(strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')
|
||||
{
|
||||
if(function_exists('ftp_chmod'))
|
||||
{
|
||||
if(!ftp_chmod($this->connection, 0755, $ftp_path))
|
||||
{
|
||||
return new BaseObject(-1, "msg_permission_adjust_failed");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!ftp_site($this->connection, "CHMOD 755 " . $ftp_path))
|
||||
{
|
||||
return new BaseObject(-1, "msg_permission_adjust_failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!ftp_put($this->connection, $target_dir . '/' . $file, FileHandler::getRealPath($this->download_path . "/" . $org_file), FTP_BINARY))
|
||||
{
|
||||
return new BaseObject(-1, "msg_ftp_upload_failed");
|
||||
}
|
||||
$copied[] = $path;
|
||||
}
|
||||
}
|
||||
|
||||
FileHandler::clearStatCache($copied, true);
|
||||
FileHandler::invalidateOpcache($copied);
|
||||
|
||||
$this->_close();
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Module installer for FTP
|
||||
* @author NAVER (developers@xpressengine.com)
|
||||
*/
|
||||
class FTPModuleInstaller extends ModuleInstaller
|
||||
{
|
||||
|
||||
/**
|
||||
* FTP instance
|
||||
* @var FTP
|
||||
*/
|
||||
var $oFtp = NULL;
|
||||
|
||||
/**
|
||||
* FTP information
|
||||
* @var object
|
||||
*/
|
||||
var $ftp_info = NULL;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param object $package Package information
|
||||
*/
|
||||
function __construct(&$package)
|
||||
{
|
||||
$this->package = &$package;
|
||||
$this->ftp_info = Context::getFTPInfo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect to FTP
|
||||
*
|
||||
* @return Object
|
||||
*/
|
||||
function _connect()
|
||||
{
|
||||
if($this->ftp_info->ftp_host)
|
||||
{
|
||||
$ftp_host = $this->ftp_info->ftp_host;
|
||||
}
|
||||
else
|
||||
{
|
||||
$ftp_host = "127.0.0.1";
|
||||
}
|
||||
|
||||
$this->oFtp = new ftp();
|
||||
if(!$this->oFtp->ftp_connect($ftp_host, $this->ftp_info->ftp_port))
|
||||
{
|
||||
return new BaseObject(-1, sprintf(lang('msg_ftp_not_connected'), 'host'));
|
||||
}
|
||||
if(!$this->oFtp->ftp_login($this->ftp_info->ftp_user, $this->ftp_password))
|
||||
{
|
||||
$this->_close();
|
||||
return new BaseObject(-1, 'msg_ftp_invalid_auth_info');
|
||||
}
|
||||
$_SESSION['ftp_password'] = $this->ftp_password;
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove file
|
||||
*
|
||||
* @param string $path Path to remove
|
||||
* @return Object
|
||||
*/
|
||||
function _removeFile($path)
|
||||
{
|
||||
if(substr($path, 0, 2) == "./")
|
||||
{
|
||||
$path = substr($path, 2);
|
||||
}
|
||||
$target_path = $this->ftp_info->ftp_root_path . $path;
|
||||
|
||||
if(!$this->oFtp->ftp_delete($target_path))
|
||||
{
|
||||
return new BaseObject(-1, sprintf(lang('msg_delete_file_failed'), $path));
|
||||
}
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove directory
|
||||
* @param string $path Path to remove
|
||||
* @return Object
|
||||
*/
|
||||
function _removeDir_real($path)
|
||||
{
|
||||
if(substr($path, 0, 2) == "./")
|
||||
{
|
||||
$path = substr($path, 2);
|
||||
}
|
||||
$target_path = $this->ftp_info->ftp_root_path . $path;
|
||||
|
||||
if(!$this->oFtp->ftp_rmdir($target_path))
|
||||
{
|
||||
return new BaseObject(-1, sprintf(lang('msg_delete_dir_failed'), $path));
|
||||
}
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Close
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function _close()
|
||||
{
|
||||
$this->oFtp->ftp_quit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy directory
|
||||
*
|
||||
* @param array $file_list File list to copy
|
||||
* @return Object
|
||||
*/
|
||||
function _copyDir(&$file_list)
|
||||
{
|
||||
if(!$this->ftp_password)
|
||||
{
|
||||
return new BaseObject(-1, 'msg_ftp_password_input');
|
||||
}
|
||||
|
||||
$output = $this->_connect();
|
||||
if(!$output->toBool())
|
||||
{
|
||||
return $output;
|
||||
}
|
||||
|
||||
$oFtp = &$this->oFtp;
|
||||
$target_dir = $this->ftp_info->ftp_root_path . $this->target_path;
|
||||
|
||||
$copied = array();
|
||||
|
||||
if(is_array($file_list))
|
||||
{
|
||||
foreach($file_list as $k => $file)
|
||||
{
|
||||
$org_file = $file;
|
||||
if($this->package->path == ".")
|
||||
{
|
||||
$file = substr($file, 3);
|
||||
}
|
||||
$path = FileHandler::getRealPath("./" . $this->target_path . "/" . $file);
|
||||
$path_list = explode('/', dirname($this->target_path . "/" . $file));
|
||||
|
||||
$real_path = "./";
|
||||
$ftp_path = $this->ftp_info->ftp_root_path;
|
||||
|
||||
for($i = 0; $i < count($path_list); $i++)
|
||||
{
|
||||
if($path_list == "")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
$real_path .= $path_list[$i] . "/";
|
||||
$ftp_path .= $path_list[$i] . "/";
|
||||
if(!file_exists(FileHandler::getRealPath($real_path)))
|
||||
{
|
||||
$oFtp->ftp_mkdir($ftp_path);
|
||||
$oFtp->ftp_site("CHMOD 755 " . $ftp_path);
|
||||
}
|
||||
}
|
||||
$oFtp->ftp_put($target_dir . '/' . $file, FileHandler::getRealPath($this->download_path . "/" . $org_file));
|
||||
$copied[] = $path;
|
||||
}
|
||||
}
|
||||
|
||||
FileHandler::clearStatCache($copied, true);
|
||||
FileHandler::invalidateOpcache($copied);
|
||||
|
||||
$this->_close();
|
||||
|
||||
return new BaseObject();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Module installer for Direct. Not use FTP
|
||||
* @author NAVER (developers@xpressengine.com)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue