Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/concrete5/flysystem/src/Adapter/Sftp.php
Строк: 307
<?php

namespace ConcreteFlysystemAdapter;

use 
Net_SFTP;
use 
Crypt_RSA;
use 
ConcreteFlysystemAdapterInterface;
use 
ConcreteFlysystemUtil;
use 
LogicException;
use 
InvalidArgumentException;

class 
Sftp extends AbstractFtpAdapter
{
    protected 
$port = 22;
    protected 
$privatekey;
    protected 
$configurable = array('host', 'port', 'username', 'password', 'timeout', 'root', 'privateKey', 'permPrivate', 'permPublic');
    protected 
$statMap = array('mtime' => 'timestamp', 'size' => 'size');

    protected function 
prefix($path)
    {
        return 
$this->root.ltrim($path, $this->separator);
    }

    public function 
setPrivateKey($key)
    {
        
$this->privatekey = $key;

        return 
$this;
    }

    public function 
setNetSftpConnection(Net_SFTP $connection)
    {
        
$this->connection = $connection;

        return 
$this;
    }

    public function 
connect()
    {
        
$this->connection = $this->connection ?: new Net_SFTP($this->host, $this->port, $this->timeout);

        if ( ! 
$this->connection ) {
            throw new 
LogicException('Could not connect to host: '.$this->host);
        }

        
$this->login();
        
$this->setConnectionRoot();
    }

    protected function 
login()
    {
        if ( ! 
$this->connection->login($this->username, $this->getPassword())) {
            throw new 
LogicException('Could not login with username: '.$this->username.', host: '.$this->host);
        }
    }

    protected function 
setConnectionRoot()
    {
        if (
$this->root) {
            
$this->connection->chdir($this->root);
        }
    }

    public function 
getPassword()
    {
        if (
$this->privatekey) {
            return 
$this->getPrivateKey();
        }

        return 
$this->password;
    }

    public function 
getPrivateKey()
    {
        if (
is_file($this->privatekey)) {
            
$this->privatekey = file_get_contents($this->privatekey);
        }

        
$key = new Crypt_RSA();

        if (
$this->password) {
            
$key->setPassword($this->password);
        }

        
$key->loadKey($this->privatekey);

        return 
$key;
    }

    protected function 
listDirectoryContents($directory, $recursive = true)
    {
        
$result = array();
        
$connection = $this->getConnection();
        
$location = $this->prefix($directory);
        
$listing = $connection->rawlist($location);

        if (
$listing === false) {
            return array();
        }

        foreach (
$listing as $filename => $object) {
            if (
in_array($filename, array('.', '..'))) {
                continue;
            }

            
$path = empty($directory) ? $filename : ($directory . DIRECTORY_SEPARATOR . $filename);
            
$result[] = $this->normalizeListingObject($path, $object);

            if (
$recursive && $object['type'] === NET_SFTP_TYPE_DIRECTORY) {
                
$result = array_merge($result, $this->listDirectoryContents($path));
            }
        }

        return 
$result;
    }

    protected function 
normalizeListingObject($path, $object)
    {
        
$permissions = $this->normalizePermissions($object['permissions']);

        return array(
            
'path' => $path,
            
'size' => $object['size'],
            
'timestamp' => $object['mtime'],
            
'type' => ($object['type'] === 1 ? 'file' : 'dir'),
            
'visibility' => $permissions & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE,
        );
    }

    public function 
disconnect()
    {
        
$this->connection = null;
    }

    public function 
write($path, $contents, $config = null)
    {
        
$connection = $this->getConnection();
        
$this->ensureDirectory(Util::dirname($path));
        
$config = Util::ensureConfig($config);

        if ( ! 
$connection->put($path, $contents, NET_SFTP_STRING)) {
            return 
false;
        }

        if (
$config && $visibility = $config->get('visibility'))
            
$this->setVisibility($path, $visibility);

        return 
compact('contents', 'visibility', 'path');
    }

    public function 
read($path)
    {
        
$connection = $this->getConnection();

        if ((
$contents = $connection->get($path)) === false) {
            return 
false;
        }

        return 
compact('contents');
    }

    public function 
update($path, $contents, $config = null)
    {
        return 
$this->write($path, $contents, $config);
    }

    public function 
delete($path)
    {
        
$connection = $this->getConnection();

        return 
$connection->delete($path);
    }

    public function 
rename($path, $newpath)
    {
        
$connection = $this->getConnection();

        return 
$connection->rename($path, $newpath);
    }

    public function 
deleteDir($dirname)
    {
        
$connection = $this->getConnection();

        return 
$connection->delete($dirname, true);
    }

    public function 
has($path)
    {
        return 
$this->getMetadata($path);
    }

    public function 
getMetadata($path)
    {
        
$connection = $this->getConnection();
        
$info = $connection->stat($path);

        if (
$info === false) {
            return 
false;
        }

        
$result = Util::map($info, $this->statMap);
        
$result['type'] = $info['type'] === NET_SFTP_TYPE_DIRECTORY ? 'dir' : 'file';
        
$result['visibility'] = $info['permissions'] & $this->permPublic ? 'public' : 'private';

        return 
$result;
    }

    public function 
getTimestamp($path)
    {
        return 
$this->getMetadata($path);
    }

    public function 
getMimetype($path)
    {
        if ( ! 
$data = $this->read($path)) {
            return 
false;
        }

        
$data['mimetype'] = Util::guessMimeType($path, $data['contents']);

        return 
$data;
    }

    public function 
createDir($dirname)
    {
        
$connection = $this->getConnection();

        if ( ! 
$connection->mkdir($dirname, 0744, true)) {
            return 
false;
        }

        return array(
'path' => $dirname);
    }

    public function 
getVisibility($path)
    {
        return 
$this->getMetadata($path);
    }

    public function 
setVisibility($path, $visibility)
    {
        
$visibility = ucfirst($visibility);

        if ( ! isset(
$this->{'perm'.$visibility})) {
            throw new 
InvalidArgumentException('Unknown visibility: '.$visibility);
        }

        
$connection = $this->getConnection();

        return 
$connection->chmod($this->{'perm'.$visibility}, $path);
    }
}
Онлайн: 1
Реклама