%PDF- %PDF-
| Direktori : /home/lightco1/upgrade.lightco.com.au/administrator/components/com_akeeba/Model/ |
| Current File : /home/lightco1/upgrade.lightco.com.au/administrator/components/com_akeeba/Model/SFTPBrowser.php |
<?php
/**
* @package AkeebaBackup
* @copyright Copyright (c)2006-2017 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
namespace Akeeba\Backup\Admin\Model;
// Protect from unauthorized access
defined('_JEXEC') or die();
use FOF30\Model\Model;
use JText;
use RuntimeException;
class SFTPBrowser extends Model
{
/**
* The SFTP server hostname
*
* @var string
*/
public $host = '';
/**
* The SFTP server port number (default: 22)
*
* @var int
*/
public $port = 22;
/**
* Username for logging in
*
* @var string
*/
public $username = '';
/**
* Password for logging in
*
* @var string
*/
public $password = '';
/**
* Private key file for connection
*
* @var string
*/
public $privkey = '';
/**
* Public key file for connection
*
* @var string
*/
public $pubkey = '';
/**
* The directory to browse
*
* @var string
*/
public $directory = '';
/**
* Breadcrumbs to the current directory
*
* @var array
*/
public $parts = array();
/**
* Path to the parent directory
*
* @var string
*/
public $parent_directory = null;
/**
* Gets the folders contained in the remote FTP root directory defined in $this->directory
*
* @return array
*/
public function getListing()
{
$dir = $this->directory;
// Parse directory to parts
$parsed_dir = trim($dir, '/');
$this->parts = empty($parsed_dir) ? array() : explode('/', $parsed_dir);
// Find the path to the parent directory
$this->parent_directory = '';
if (!empty($parts))
{
$copy_of_parts = $parts;
array_pop($copy_of_parts);
$this->parent_directory = '/';
if (!empty($copy_of_parts))
{
$this->parent_directory = '/' . implode('/', $copy_of_parts);
}
}
// Initialise
$connection = null;
$sftphandle = null;
// Open a connection
if (!function_exists('ssh2_connect'))
{
throw new RuntimeException("Your web server does not have the SSH2 PHP module, therefore can not connect and upload archives to SFTP servers.");
}
$connection = ssh2_connect($this->host, $this->port);
if ($connection === false)
{
throw new RuntimeException("Invalid SFTP hostname or port ({$this->host}:{$this->port}) or the connection is blocked by your web server's firewall.");
}
// Connect to the server
if (!empty($this->pubkey) && !empty($this->privkey))
{
if (!ssh2_auth_pubkey_file($connection, $this->username, $this->pubkey, $this->privkey, $this->password))
{
throw new RuntimeException('Certificate error');
}
}
else
{
if (!ssh2_auth_password($connection, $this->username, $this->password))
{
throw new RuntimeException('Could not authenticate access to SFTP server; check your username and password.');
}
}
$sftphandle = ssh2_sftp($connection);
if ($sftphandle === false)
{
throw new RuntimeException("Your SSH server does not allow SFTP connections");
}
// Get a raw directory listing (hoping it's a UNIX server!)
$list = array();
$dir = ltrim($dir, '/');
if (empty($dir))
{
$dir = ssh2_sftp_realpath($sftphandle, ".");
$this->directory = $dir;
// Parse directory to parts
$parsed_dir = trim($dir, '/');
$this->parts = empty($parsed_dir) ? array() : explode('/', $parsed_dir);
// Find the path to the parent directory
$this->parent_directory = '';
if (!empty($parts))
{
$copy_of_parts = $parts;
array_pop($copy_of_parts);
$this->parent_directory = '/';
if (!empty($copy_of_parts))
{
$this->parent_directory = '/' . implode('/', $copy_of_parts);
}
}
}
$handle = opendir("ssh2.sftp://$sftphandle/$dir");
if (!is_resource($handle))
{
throw new RuntimeException(JText::_('COM_AKEEBA_SFTPBROWSER_ERROR_NOACCESS'));
}
while (($entry = readdir($handle)) !== false)
{
if (substr($entry, 0, 1) == '.')
{
continue;
}
if (!is_dir("ssh2.sftp://$sftphandle/$dir/$entry"))
{
continue;
}
$list[] = $entry;
}
closedir($handle);
if (!empty($list))
{
asort($list);
}
return $list;
}
/**
* Perform the actual folder browsing. Returns an array that's usable by the UI.
*
* @return array
*/
public function doBrowse()
{
$error = '';
$list = [];
try
{
$list = $this->getListing();
}
catch (RuntimeException $e)
{
$error = $e->getMessage();
}
$response_array = array(
'error' => $error,
'list' => $list,
'breadcrumbs' => $this->parts,
'directory' => $this->directory,
'parent' => $this->parent_directory
);
return $response_array;
}
}