Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-includes
/
wp-admin
/
includes
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php class WP_Filesystem_SSH2 extends WP_Filesystem_Base { public $link = false; public $sftp_link; public $keys = false; public function __construct($opt = '') { $this->method = 'ssh2'; $this->errors = new WP_Error(); if (!extension_loaded('ssh2')) { $this->errors->add('no_ssh2_ext', __('The ssh2 PHP extension is not available')); return; } if (empty($opt['port'])) { $this->options['port'] = 22; } else { $this->options['port'] = $opt['port']; } if (empty($opt['hostname'])) { $this->errors->add('empty_hostname', __('SSH2 hostname is required')); } else { $this->options['hostname'] = $opt['hostname']; } if (!empty($opt['public_key']) && !empty($opt['private_key'])) { $this->options['public_key'] = $opt['public_key']; $this->options['private_key'] = $opt['private_key']; $this->options['hostkey'] = array('hostkey' => 'ssh-rsa'); $this->keys = true; } elseif (empty($opt['username'])) { $this->errors->add('empty_username', __('SSH2 username is required')); } if (!empty($opt['username'])) { $this->options['username'] = $opt['username']; } if (empty($opt['password'])) { if (!$this->keys) { $this->errors->add('empty_password', __('SSH2 password is required')); } } else { $this->options['password'] = $opt['password']; } } public function connect() { if (!$this->keys) { $this->link = @ssh2_connect($this->options['hostname'], $this->options['port']); } else { $this->link = @ssh2_connect($this->options['hostname'], $this->options['port'], $this->options['hostkey']); } if (!$this->link) { $this->errors->add('connect', sprintf(__('Failed to connect to SSH2 Server %s'), $this->options['hostname'] . ':' . $this->options['port'])); return false; } if (!$this->keys) { if (!@ssh2_auth_password($this->link, $this->options['username'], $this->options['password'])) { $this->errors->add('auth', sprintf(__('Username/Password incorrect for %s'), $this->options['username'])); return false; } } else { if (!@ssh2_auth_pubkey_file($this->link, $this->options['username'], $this->options['public_key'], $this->options['private_key'], $this->options['password'])) { $this->errors->add('auth', sprintf(__('Public and Private keys incorrect for %s'), $this->options['username'])); return false; } } $this->sftp_link = ssh2_sftp($this->link); if (!$this->sftp_link) { $this->errors->add('connect', sprintf(__('Failed to initialize a SFTP subsystem session with the SSH2 Server %s'), $this->options['hostname'] . ':' . $this->options['port'])); return false; } return true; } public function sftp_path($path) { if ('/' === $path) { $path = '/./'; } return 'ssh2.sftp://' . $this->sftp_link . '/' . ltrim($path, '/'); } public function run_command($command, $returnbool = false) { if (!$this->link) { return false; } $stream = ssh2_exec($this->link, $command); if (!$stream) { $this->errors->add('command', sprintf(__('Unable to perform command: %s'), $command)); } else { stream_set_blocking($stream, true); stream_set_timeout($stream, FS_TIMEOUT); $data = stream_get_contents($stream); fclose($stream); if ($returnbool) { return false === $data ? false : '' !== trim($data); } else { return $data; } } return false; } public function get_contents($file) { return file_get_contents($this->sftp_path($file)); } public function get_contents_array($file) { return file($this->sftp_path($file)); } public function put_contents($file, $contents, $mode = false) { $ret = file_put_contents($this->sftp_path($file), $contents); if (strlen($contents) !== $ret) { return false; } $this->chmod($file, $mode); return true; } public function cwd() { $cwd = ssh2_sftp_realpath($this->sftp_link, '.'); if ($cwd) { $cwd = trailingslashit(trim($cwd)); } return $cwd; } public function chdir($dir) { return $this->run_command('cd ' . $dir, true); } public function chgrp($file, $group, $recursive = false) { if (!$this->exists($file)) { return false; } if (!$recursive || !$this->is_dir($file)) { return $this->run_command(sprintf('chgrp %s %s', escapeshellarg($group), escapeshellarg($file)), true); } return $this->run_command(sprintf('chgrp -R %s %s', escapeshellarg($group), escapeshellarg($file)), true); } public function chmod($file, $mode = false, $recursive = false) { if (!$this->exists($file)) { return false; } if (!$mode) { if ($this->is_file($file)) { $mode = FS_CHMOD_FILE; } elseif ($this->is_dir($file)) { $mode = FS_CHMOD_DIR; } else { return false; } } if (!$recursive || !$this->is_dir($file)) { return $this->run_command(sprintf('chmod %o %s', $mode, escapeshellarg($file)), true); } return $this->run_command(sprintf('chmod -R %o %s', $mode, escapeshellarg($file)), true); } public function chown($file, $owner, $recursive = false) { if (!$this->exists($file)) { return false; } if (!$recursive || !$this->is_dir($file)) { return $this->run_command(sprintf('chown %s %s', escapeshellarg($owner), escapeshellarg($file)), true); } return $this->run_command(sprintf('chown -R %s %s', escapeshellarg($owner), escapeshellarg($file)), true); } public function owner($file) { $owneruid = @fileowner($this->sftp_path($file)); if (!$owneruid) { return false; } if (!function_exists('posix_getpwuid')) { return $owneruid; } $ownerarray = posix_getpwuid($owneruid); if (!$ownerarray) { return false; } return $ownerarray['name']; } public function getchmod($file) { return substr(decoct(@fileperms($this->sftp_path($file))), -3); } public function group($file) { $gid = @filegroup($this->sftp_path($file)); if (!$gid) { return false; } if (!function_exists('posix_getgrgid')) { return $gid; } $grouparray = posix_getgrgid($gid); if (!$grouparray) { return false; } return $grouparray['name']; } public function copy($source, $destination, $overwrite = false, $mode = false) { if (!$overwrite && $this->exists($destination)) { return false; } $content = $this->get_contents($source); if (false === $content) { return false; } return $this->put_contents($destination, $content, $mode); } public function move($source, $destination, $overwrite = false) { if ($this->exists($destination)) { if ($overwrite) { $this->delete($destination, false, 'f'); } else { return false; } } return ssh2_sftp_rename($this->sftp_link, $source, $destination); } public function delete($file, $recursive = false, $type = false) { if ('f' === $type || $this->is_file($file)) { return ssh2_sftp_unlink($this->sftp_link, $file); } if (!$recursive) { return ssh2_sftp_rmdir($this->sftp_link, $file); } $filelist = $this->dirlist($file); if (is_array($filelist)) { foreach ($filelist as $filename => $fileinfo) { $this->delete($file . '/' . $filename, $recursive, $fileinfo['type']); } } return ssh2_sftp_rmdir($this->sftp_link, $file); } public function exists($file) { return file_exists($this->sftp_path($file)); } public function is_file($file) { return is_file($this->sftp_path($file)); } public function is_dir($path) { return is_dir($this->sftp_path($path)); } public function is_readable($file) { return is_readable($this->sftp_path($file)); } public function is_writable($file) { return true; } public function atime($file) { return fileatime($this->sftp_path($file)); } public function mtime($file) { return filemtime($this->sftp_path($file)); } public function size($file) { return filesize($this->sftp_path($file)); } public function touch($file, $time = 0, $atime = 0) { } public function mkdir($path, $chmod = false, $chown = false, $chgrp = false) { $path = untrailingslashit($path); if (empty($path)) { return false; } if (!$chmod) { $chmod = FS_CHMOD_DIR; } if (!ssh2_sftp_mkdir($this->sftp_link, $path, $chmod, true)) { return false; } ssh2_sftp_chmod($this->sftp_link, $path, $chmod); if ($chown) { $this->chown($path, $chown); } if ($chgrp) { $this->chgrp($path, $chgrp); } return true; } public function rmdir($path, $recursive = false) { return $this->delete($path, $recursive); } public function dirlist($path, $include_hidden = true, $recursive = false) { if ($this->is_file($path)) { $limit_file = basename($path); $path = dirname($path); } else { $limit_file = false; } if (!$this->is_dir($path) || !$this->is_readable($path)) { return false; } $ret = array(); $dir = dir($this->sftp_path($path)); if (!$dir) { return false; } while (false !== ($entry = $dir->read())) { $struc = array(); $struc['name'] = $entry; if ('.' === $struc['name'] || '..' === $struc['name']) { continue; } if (!$include_hidden && '.' === $struc['name'][0]) { continue; } if ($limit_file && $struc['name'] != $limit_file) { continue; } $struc['perms'] = $this->gethchmod($path . '/' . $entry); $struc['permsn'] = $this->getnumchmodfromh($struc['perms']); $struc['number'] = false; $struc['owner'] = $this->owner($path . '/' . $entry); $struc['group'] = $this->group($path . '/' . $entry); $struc['size'] = $this->size($path . '/' . $entry); $struc['lastmodunix'] = $this->mtime($path . '/' . $entry); $struc['lastmod'] = gmdate('M j', $struc['lastmodunix']); $struc['time'] = gmdate('h:i:s', $struc['lastmodunix']); $struc['type'] = $this->is_dir($path . '/' . $entry) ? 'd' : 'f'; if ('d' === $struc['type']) { if ($recursive) { $struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive); } else { $struc['files'] = array(); } } $ret[$struc['name']] = $struc; } $dir->close(); unset($dir); return $ret; } }