Файл: system/controllers/admin/actions/install_ftp.php
Строк: 188
<?php
class actionAdminInstallFtp extends cmsAction {
public function run(){
if (!$this->getPackageContentsDir()){
$this->redirectToAction('install/finish');
}
$form = $this->getForm('ftp');
$ftp_account = cmsUser::getUPS('admin.install.ftp');
$account = cmsUser::isSessionSet('ftp_account') ? cmsUser::sessionGet('ftp_account') : ($ftp_account ? $ftp_account : array());
if ($this->request->has('submit')){
$account = array_merge($account, $form->parse($this->request, true, $account));
cmsUser::setUPS('admin.install.ftp', array(
'host' => $account['host'],
'port' => $account['port'],
'path' => $account['path'],
'is_pasv' => $account['is_pasv']
));
if($account['save_to_session']){
cmsUser::sessionSet('ftp_account', $account);
} else {
cmsUser::sessionUnset('ftp_account');
}
$errors = $form->validate($this, $account);
if ($errors){
cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
}
if (!$errors){
$account['host'] = trim(str_replace('ftp://', '', $account['host']), '/');
if ($account['path'] != '/' ) {
$account['path'] = '/' . trim($account['path'], '/') . '/';
}
$this->uploadPackageToFTP($account);
}
}
return $this->cms_template->render('install_ftp', array(
'manifest' => $this->parsePackageManifest(),
'account' => $account,
'form' => $form,
'errors' => isset($errors) ? $errors : false
));
}
private function getPackageContentsDir(){
$config = cmsConfig::getInstance();
$path = $config->upload_path . $this->installer_upload_path . '/' . 'package';
if (!is_dir($path)) { return false; }
return $path;
}
private function uploadPackageToFTP($account){
$connection = @ftp_connect($account['host'], $account['port'], 30);
if (!$connection){ cmsUser::addSessionMessage(LANG_CP_FTP_CONNECT_FAILED, 'error'); return false; }
$session = @ftp_login($connection, $account['user'], $account['pass']);
if (!$session){ cmsUser::addSessionMessage(LANG_CP_FTP_AUTH_FAILED, 'error'); return false; }
if($account['is_pasv']) { ftp_pasv($connection, true); }
if (!$this->checkDestination($connection, $account)){
return false;
}
$src_dir = $this->getPackageContentsDir();
$dst_dir = '/' . trim($account['path'], '/');
try{
$this->uploadDirectoryToFTP($connection, $src_dir, $dst_dir);
} catch (Exception $e) {
ftp_close($connection);
cmsUser::addSessionMessage($e->getMessage(), 'error');
return false;
}
ftp_close($connection);
$this->redirectToAction('install/finish');
return true;
}
private function checkDestination($connection, $account) {
$ftp_path = 'ftp://' . $account['host'] . $account['path'];
$check_dirs = array(
'system/core' => 'core.php',
'system/config' => 'config.php'
);
if (!ftp_nlist($connection, $account['path'])){
cmsUser::addSessionMessage(sprintf(LANG_CP_FTP_NO_ROOT, $ftp_path), 'error');
return false;
}
$files_list = array();
foreach ($check_dirs as $dir => $file) {
$contents = ftp_nlist($connection, $account['path'] . $dir);
if (is_array($contents)){
foreach ($contents as $item) {
$files_list[] = basename($item);
}
}
if (!$files_list || !in_array($file, $files_list)) {
cmsUser::addSessionMessage(sprintf(LANG_CP_FTP_BAD_ROOT, $ftp_path), 'error');
return false;
}
}
return true;
}
private function uploadDirectoryToFTP($conn_id, $src_dir, $dst_dir) {
$d = dir($src_dir);
$is_function_exists_ftp_chmod = function_exists('ftp_chmod');
while($file = $d->read()) {
if ($file != "." && $file != "..") {
if (is_dir($src_dir."/".$file)) {
if (!@ftp_chdir($conn_id, $dst_dir."/".$file)) {
$result = @ftp_mkdir($conn_id, $dst_dir."/".$file);
if (!$result) {throw new Exception(LANG_CP_FTP_MKDIR_FAILED.': '.$dst_dir."/".$file);}
if($is_function_exists_ftp_chmod){
@ftp_chmod($conn_id, 0755, $dst_dir."/".$file);
}
}
$this->uploadDirectoryToFTP($conn_id, $src_dir."/".$file, $dst_dir."/".$file);
} else {
$result = @ftp_put($conn_id, $dst_dir."/".$file, $src_dir."/".$file, FTP_BINARY);
if (!$result) { throw new Exception(LANG_CP_FTP_UPLOAD_FAILED); }
if($is_function_exists_ftp_chmod){
@ftp_chmod($conn_id, 0644, $dst_dir."/".$file);
}
}
}
}
$d->close();
}
}