File: /home/studiomoguls/webapps/Studio-mogulsc-clone/wp-content/plugins/iwp-client/backup/ftp.php
<?php
if ( ! defined('ABSPATH') )
die();
if (!class_exists('IWP_MMB_UploadModule')) require_once($GLOBALS['iwp_mmb_plugin_dir'].'/backup/backup.upload.php');
class IWP_MMB_UploadModule_ftp extends IWP_MMB_UploadModule {
// Get FTP object with parameters set
private function getFTP($server, $user, $pass, $disable_ssl = false, $disable_verify = true, $use_server_certs = false, $passive = true) {
if ('' == trim($server) || '' == trim($user) || '' == trim($pass)) return new WP_Error('no_settings', sprintf(__('No %s settings were found','InfiniteWP'), 'FTP'));
if( !class_exists('IWP_MMB_ftp_wrapper')) require_once($GLOBALS['iwp_mmb_plugin_dir'].'/lib/ftp.class.php');
$port = 21;
if (preg_match('/^(.*):(\d+)$/', $server, $matches)) {
$server = $matches[1];
$port = $matches[2];
}
$ftp = new IWP_MMB_ftp_wrapper($server, $user, $pass, $port);
if ($disable_ssl) $ftp->ssl = false;
$ftp->use_server_certs = $use_server_certs;
$ftp->disable_verify = $disable_verify;
$ftp->passive = ($passive) ? true : false;
return $ftp;
}
public function get_supported_features() {
// This options format is handled via only accessing options via $this->get_options()
return array('multi_options');
}
public function get_default_options() {
return array(
'host' => '',
'user' => '',
'pass' => '',
'path' => '',
'passive' => true
);
}
public function backup($backup_array) {
global $iwp_backup_core;
$opts = $this->get_options();
$ftp = $this->getFTP(
$opts['host'],
$opts['user'],
$opts['pass'],
$iwp_backup_core->get_job_option('IWP_ssl_nossl'),
$iwp_backup_core->get_job_option('IWP_ssl_disableverify'),
$iwp_backup_core->get_job_option('IWP_ssl_useservercerts'),
$opts['passive']
);
if (is_wp_error($ftp) || !$ftp->connect()) {
if (is_wp_error($ftp)) {
$iwp_backup_core->log_wp_error($ftp);
} else {
$iwp_backup_core->log("FTP Failure: we did not successfully log in with those credentials.");
}
$iwp_backup_core->log(sprintf(__("%s login failure",'InfiniteWP'), 'FTP'), 'error');
return false;
}
//$ftp->make_dir(); we may need to recursively create dirs? TODO
$iwp_backup_dir = $iwp_backup_core->backups_dir_location().'/';
$ftp_remote_path = trailingslashit($opts['path']);
if (!empty($opts['ftp_site_folder'])) {
$site_name = iwp_getSiteName();
$ftp_remote_path.= trailingslashit($site_name);
}
foreach($backup_array as $file) {
$fullpath = $iwp_backup_dir.$file;
$iwp_backup_core->log("FTP upload attempt: $file -> ftp://".$opts['user']."@".$opts['host']."/${ftp_remote_path}${file}");
$timer_start = microtime(true);
$size_k = round(filesize($fullpath)/1024,1);
# Note :Setting $resume to true unnecessarily is not meant to be a problem. Only ever (Feb 2014) seen one weird FTP server where calling SIZE on a non-existent file did create a problem. So, this code just helps that case. (the check for non-empty upload_status[p] is being cautious.
$upload_status = $iwp_backup_core->jobdata_get('uploading_substatus');
if (0 == $iwp_backup_core->current_resumption || (is_array($upload_status) && !empty($upload_status['p']) && $upload_status['p'] == 0)) {
$resume = false;
} else {
$resume = true;
}
if ($ftp->put($fullpath, $ftp_remote_path.$file, FTP_BINARY, $resume, $iwp_backup_core, $ftp_remote_path)) {
$iwp_backup_core->log("FTP upload attempt successful (".$size_k."KB in ".(round(microtime(true)-$timer_start,2)).'s)');
$iwp_backup_core->uploaded_file($file);
} else {
$iwp_backup_core->log("ERROR: FTP upload failed" );
$iwp_backup_core->log(sprintf(__("%s upload failed",'InfiniteWP'), 'FTP'), 'error');
}
}
return array('ftp_object' => $ftp, 'ftp_remote_path' => $ftp_remote_path);
}
public function listfiles($match = 'backup_') {
global $iwp_backup_core;
$opts = $this->get_options();
$ftp = $this->getFTP(
$opts['host'],
$opts['user'],
$opts['pass'],
$iwp_backup_core->get_job_option('IWP_ssl_nossl'),
$iwp_backup_core->get_job_option('IWP_ssl_disableverify'),
$iwp_backup_core->get_job_option('IWP_ssl_useservercerts'),
$opts['passive']
);
if (is_wp_error($ftp)) return $ftp;
if (!$ftp->connect()) return new WP_Error('ftp_login_failed', sprintf(__("%s login failure",'InfiniteWP'), 'FTP'));
$ftp_remote_path = $opts['path'];
if ($ftp_remote_path) $ftp_remote_path = trailingslashit($ftp_remote_path);
if (!empty($opts['ftp_site_folder'])) {
$site_name = iwp_getSiteName();
$ftp_remote_path.= trailingslashit($site_name);
}
$dirlist = $ftp->dir_list($ftp_remote_path);
if (!is_array($dirlist)) return array();
$results = array();
foreach ($dirlist as $k => $path) {
if ($ftp_remote_path) {
// Feb 2015 - found a case where the directory path was not prefixed on
if (0 !== strpos($path, $ftp_remote_path) && (false !== strpos('/', $ftp_remote_path) && false !== strpos('\\', $ftp_remote_path))) continue;
if (0 === strpos($path, $ftp_remote_path)) $path = substr($path, strlen($ftp_remote_path));
// if (0 !== strpos($path, $ftp_remote_path)) continue;
// $path = substr($path, strlen($ftp_remote_path));
if (0 === strpos($path, $match)) $results[]['name'] = $path;
} else {
if ('/' == substr($path, 0, 1)) $path = substr($path, 1);
if (false !== strpos($path, '/')) continue;
if (0 === strpos($path, $match)) $results[]['name'] = $path;
}
unset($dirlist[$k]);
}
# ftp_nlist() doesn't return file sizes. rawlist() does, but is tricky to parse. So, we get the sizes manually.
foreach ($results as $ind => $name) {
$size = $ftp->size($ftp_remote_path.$name['name']);
if (0 === $size) {
unset($results[$ind]);
} elseif ($size>0) {
$results[$ind]['size'] = $size;
}
}
return $results;
}
public function delete($files, $ftparr = array(), $sizeinfo = array()) {
global $iwp_backup_core;
if (is_string($files)) $files=array($files);
$opts = $this->get_options();
if (is_array($ftparr) && isset($ftparr['ftp_object'])) {
$ftp = $ftparr['ftp_object'];
} else {
$ftp = $this->getFTP(
$opts['host'],
$opts['user'],
$opts['pass'],
$iwp_backup_core->get_job_option('IWP_ssl_nossl'),
$iwp_backup_core->get_job_option('IWP_ssl_disableverify'),
$iwp_backup_core->get_job_option('IWP_ssl_useservercerts'),
$opts['passive']
);
if (is_wp_error($ftp) || !$ftp->connect()) {
if (is_wp_error($ftp)) $iwp_backup_core->log_wp_error($ftp);
$iwp_backup_core->log("FTP Failure: we did not successfully log in with those credentials (host=".$opts['host'].").");
return false;
}
}
$ftp_remote_path = isset($ftparr['ftp_remote_path']) ? $ftparr['ftp_remote_path'] : trailingslashit($opts['path']);
if (!empty($opts['ftp_site_folder'])) {
$site_name = iwp_getSiteName();
$ftp_remote_path.= trailingslashit($site_name);
}
$ret = true;
foreach ($files as $file) {
if (@$ftp->delete($ftp_remote_path.$file)) {
$iwp_backup_core->log("FTP delete: succeeded (${ftp_remote_path}${file})");
} else {
$iwp_backup_core->log("FTP delete: failed (${ftp_remote_path}${file})");
$ret = false;
}
}
return $ret;
}
public function download($file) {
global $iwp_backup_core;
$opts = $this->get_options();
$ftp = $this->getFTP(
$opts['host'],
$opts['user'],
$opts['pass'],
$iwp_backup_core->get_job_option('IWP_ssl_nossl'),
$iwp_backup_core->get_job_option('IWP_ssl_disableverify'),
$iwp_backup_core->get_job_option('IWP_ssl_useservercerts'),
$opts['passive']
);
if (is_wp_error($ftp)) return $ftp;
if (!$ftp->connect()) {
$iwp_backup_core->log("FTP Failure: we did not successfully log in with those credentials.");
$iwp_backup_core->log(sprintf(__("%s login failure",'iwp_backup_core'), 'FTP'), 'error');
return false;
}
//$ftp->make_dir(); we may need to recursively create dirs? TODO
$ftp_remote_path = trailingslashit($opts['path']);
if (!empty($opts['ftp_site_folder'])) {
$site_name = iwp_getSiteName();
$ftp_remote_path.= trailingslashit($site_name);
}
$fullpath = $iwp_backup_core->backups_dir_location().'/'.$file;
$resume = false;
if (file_exists($fullpath)) {
$resume = true;
$iwp_backup_core->log("File already exists locally; will resume: size: ".filesize($fullpath));
}
return $ftp->get($fullpath, $ftp_remote_path.$file, FTP_BINARY, $resume, $iwp_backup_core);
}
private function ftp_possible() {
$funcs_disabled = array();
foreach (array('ftp_connect', 'ftp_login', 'ftp_nb_fput') as $func) {
if (!function_exists($func)) $funcs_disabled['ftp'][] = $func;
}
$funcs_disabled = apply_filters('IWP_ftp_possible', $funcs_disabled);
return (0 == count($funcs_disabled)) ? true : $funcs_disabled;
}
public function config_print() {
global $iwp_backup_core;
$possible = $this->ftp_possible();
$opts = $this->get_options();
}
}