Version Description
Download this release
Release Info
Developer | DavidAnderson |
Plugin | SSH SFTP Updater Support |
Version | 0.7.6 |
Comparing to | |
See all releases |
Code changes from version 0.7.5 to 0.7.6
- class-wp-filesystem-ssh2.php +29 -29
- phpseclib/Crypt/Base.php +4 -4
- phpseclib/Crypt/Hash.php +78 -20
- phpseclib/File/ASN1.php +12 -0
- phpseclib/File/X509.php +14 -8
- phpseclib/Math/BigInteger.php +0 -1
- phpseclib/Net/SFTP.php +11 -1
- phpseclib/Net/SSH2.php +177 -22
- phpseclib/System/SSH/Agent.php +14 -0
- readme.txt +19 -3
- sftp.php +15 -8
class-wp-filesystem-ssh2.php
CHANGED
@@ -73,7 +73,7 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
73 |
}
|
74 |
}
|
75 |
|
76 |
-
function connect() {
|
77 |
$this->link = new Net_SFTP($this->options['hostname'], $this->options['port']);
|
78 |
|
79 |
if ( !$this->keys ) {
|
@@ -101,7 +101,7 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
101 |
return true;
|
102 |
}
|
103 |
|
104 |
-
function handle_connect_error() {
|
105 |
if ( ! $this->link->isConnected() ) {
|
106 |
$this->errors->add('connect', sprintf(__('Failed to connect to SSH2 Server %1$s:%2$s'), $this->options['hostname'], $this->options['port']));
|
107 |
$this->errors->add('connect2', __('If SELinux is installed check to make sure that <code>httpd_can_network_connect</code> is set to 1'));
|
@@ -111,7 +111,7 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
111 |
return false;
|
112 |
}
|
113 |
|
114 |
-
function run_command( $command, $returnbool = false) {
|
115 |
|
116 |
if ( ! $this->link )
|
117 |
return false;
|
@@ -124,11 +124,11 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
124 |
return $data;
|
125 |
}
|
126 |
|
127 |
-
function get_contents($file, $type = '', $resumepos = 0 ) {
|
128 |
return $this->link->get($file);
|
129 |
}
|
130 |
|
131 |
-
function get_contents_array($file) {
|
132 |
$lines = preg_split('#(\r\n|\r|\n)#', $this->link->get($file), -1, PREG_SPLIT_DELIM_CAPTURE);
|
133 |
$newLines = array();
|
134 |
for ($i = 0; $i < count($lines); $i+= 2)
|
@@ -136,7 +136,7 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
136 |
return $newLines;
|
137 |
}
|
138 |
|
139 |
-
function put_contents($file, $contents, $mode = false ) {
|
140 |
$ret = $this->link->put($file, $contents);
|
141 |
|
142 |
$this->chmod($file, $mode);
|
@@ -144,19 +144,19 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
144 |
return false !== $ret;
|
145 |
}
|
146 |
|
147 |
-
function cwd() {
|
148 |
$cwd = $this->run_command('pwd');
|
149 |
if ( $cwd )
|
150 |
$cwd = trailingslashit($cwd);
|
151 |
return $cwd;
|
152 |
}
|
153 |
|
154 |
-
function chdir($dir) {
|
155 |
$this->list->chdir($dir);
|
156 |
return $this->run_command('cd ' . $dir, true);
|
157 |
}
|
158 |
|
159 |
-
function chgrp($file, $group, $recursive = false ) {
|
160 |
if ( ! $this->exists($file) )
|
161 |
return false;
|
162 |
if ( ! $recursive || ! $this->is_dir($file) )
|
@@ -164,11 +164,11 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
164 |
return $this->run_command(sprintf('chgrp -R %o %s', $mode, escapeshellarg($file)), true);
|
165 |
}
|
166 |
|
167 |
-
function chmod($file, $mode = false, $recursive = false) {
|
168 |
return $mode === false ? false : $this->link->chmod($mode, $file, $recursive);
|
169 |
}
|
170 |
|
171 |
-
function chown($file, $owner, $recursive = false ) {
|
172 |
if ( ! $this->exists($file) )
|
173 |
return false;
|
174 |
if ( ! $recursive || ! $this->is_dir($file) )
|
@@ -176,7 +176,7 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
176 |
return $this->run_command(sprintf('chown -R %o %s', $mode, escapeshellarg($file)), true);
|
177 |
}
|
178 |
|
179 |
-
function owner($file, $owneruid = false) {
|
180 |
if ($owneruid === false) {
|
181 |
$result = $this->link->stat($file);
|
182 |
$owneruid = $result['uid'];
|
@@ -190,13 +190,13 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
190 |
return $ownerarray['name'];
|
191 |
}
|
192 |
|
193 |
-
function getchmod($file) {
|
194 |
$result = $this->link->stat($file);
|
195 |
|
196 |
return substr(decoct($result['permissions']),3);
|
197 |
}
|
198 |
|
199 |
-
function group($file, $gid = false) {
|
200 |
if ($gid === false) {
|
201 |
$result = $this->link->stat($file);
|
202 |
$gid = $result['gid'];
|
@@ -210,7 +210,7 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
210 |
return $grouparray['name'];
|
211 |
}
|
212 |
|
213 |
-
function copy($source, $destination, $overwrite = false, $mode = false) {
|
214 |
if ( ! $overwrite && $this->exists($destination) )
|
215 |
return false;
|
216 |
$content = $this->get_contents($source);
|
@@ -219,11 +219,11 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
219 |
return $this->put_contents($destination, $content, $mode);
|
220 |
}
|
221 |
|
222 |
-
function move($source, $destination, $overwrite = false) {
|
223 |
return $this->link->rename($source, $destination);
|
224 |
}
|
225 |
|
226 |
-
function delete($file, $recursive = false, $type = false) {
|
227 |
if ( 'f' == $type || $this->is_file($file) )
|
228 |
return $this->link->delete($file);
|
229 |
if ( ! $recursive )
|
@@ -231,52 +231,52 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
231 |
return $this->link->delete($file, $recursive);
|
232 |
}
|
233 |
|
234 |
-
function exists($file) {
|
235 |
return $this->link->stat($file) !== false;
|
236 |
}
|
237 |
|
238 |
-
function is_file($file) {
|
239 |
$result = $this->link->stat($file);
|
240 |
return $result['type'] == NET_SFTP_TYPE_REGULAR;
|
241 |
}
|
242 |
|
243 |
-
function is_dir($path) {
|
244 |
$result = $this->link->stat($path);
|
245 |
return $result['type'] == NET_SFTP_TYPE_DIRECTORY;
|
246 |
}
|
247 |
|
248 |
-
function is_readable($file) {
|
249 |
return true;
|
250 |
|
251 |
return is_readable('ssh2.sftp://' . $this->sftp_link . '/' . $file);
|
252 |
}
|
253 |
|
254 |
-
function is_writable($file) {
|
255 |
return true;
|
256 |
|
257 |
return is_writable('ssh2.sftp://' . $this->sftp_link . '/' . $file);
|
258 |
}
|
259 |
|
260 |
-
function atime($file) {
|
261 |
$result = $this->link->stat($file);
|
262 |
return $result['atime'];
|
263 |
}
|
264 |
|
265 |
-
function mtime($file) {
|
266 |
$result = $this->link->stat($file);
|
267 |
return $result['mtime'];
|
268 |
}
|
269 |
|
270 |
-
function size($file) {
|
271 |
$result = $this->link->stat($file);
|
272 |
return $result['size'];
|
273 |
}
|
274 |
|
275 |
-
function touch($file, $time = 0, $atime = 0) {
|
276 |
//Not implmented.
|
277 |
}
|
278 |
|
279 |
-
function mkdir($path, $chmod = false, $chown = false, $chgrp = false) {
|
280 |
$path = untrailingslashit($path);
|
281 |
if ( ! $chmod )
|
282 |
$chmod = FS_CHMOD_DIR;
|
@@ -291,11 +291,11 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
|
|
291 |
return true;
|
292 |
}
|
293 |
|
294 |
-
function rmdir($path, $recursive = false) {
|
295 |
return $this->delete($path, $recursive);
|
296 |
}
|
297 |
|
298 |
-
function dirlist($path, $include_hidden = true, $recursive = false) {
|
299 |
if ( $this->is_file($path) ) {
|
300 |
$limit_file = basename($path);
|
301 |
$path = dirname($path);
|
73 |
}
|
74 |
}
|
75 |
|
76 |
+
public function connect() {
|
77 |
$this->link = new Net_SFTP($this->options['hostname'], $this->options['port']);
|
78 |
|
79 |
if ( !$this->keys ) {
|
101 |
return true;
|
102 |
}
|
103 |
|
104 |
+
public function handle_connect_error() {
|
105 |
if ( ! $this->link->isConnected() ) {
|
106 |
$this->errors->add('connect', sprintf(__('Failed to connect to SSH2 Server %1$s:%2$s'), $this->options['hostname'], $this->options['port']));
|
107 |
$this->errors->add('connect2', __('If SELinux is installed check to make sure that <code>httpd_can_network_connect</code> is set to 1'));
|
111 |
return false;
|
112 |
}
|
113 |
|
114 |
+
public function run_command( $command, $returnbool = false) {
|
115 |
|
116 |
if ( ! $this->link )
|
117 |
return false;
|
124 |
return $data;
|
125 |
}
|
126 |
|
127 |
+
public function get_contents($file, $type = '', $resumepos = 0 ) {
|
128 |
return $this->link->get($file);
|
129 |
}
|
130 |
|
131 |
+
public function get_contents_array($file) {
|
132 |
$lines = preg_split('#(\r\n|\r|\n)#', $this->link->get($file), -1, PREG_SPLIT_DELIM_CAPTURE);
|
133 |
$newLines = array();
|
134 |
for ($i = 0; $i < count($lines); $i+= 2)
|
136 |
return $newLines;
|
137 |
}
|
138 |
|
139 |
+
public function put_contents($file, $contents, $mode = false ) {
|
140 |
$ret = $this->link->put($file, $contents);
|
141 |
|
142 |
$this->chmod($file, $mode);
|
144 |
return false !== $ret;
|
145 |
}
|
146 |
|
147 |
+
public function cwd() {
|
148 |
$cwd = $this->run_command('pwd');
|
149 |
if ( $cwd )
|
150 |
$cwd = trailingslashit($cwd);
|
151 |
return $cwd;
|
152 |
}
|
153 |
|
154 |
+
public function chdir($dir) {
|
155 |
$this->list->chdir($dir);
|
156 |
return $this->run_command('cd ' . $dir, true);
|
157 |
}
|
158 |
|
159 |
+
public function chgrp($file, $group, $recursive = false ) {
|
160 |
if ( ! $this->exists($file) )
|
161 |
return false;
|
162 |
if ( ! $recursive || ! $this->is_dir($file) )
|
164 |
return $this->run_command(sprintf('chgrp -R %o %s', $mode, escapeshellarg($file)), true);
|
165 |
}
|
166 |
|
167 |
+
public function chmod($file, $mode = false, $recursive = false) {
|
168 |
return $mode === false ? false : $this->link->chmod($mode, $file, $recursive);
|
169 |
}
|
170 |
|
171 |
+
public function chown($file, $owner, $recursive = false ) {
|
172 |
if ( ! $this->exists($file) )
|
173 |
return false;
|
174 |
if ( ! $recursive || ! $this->is_dir($file) )
|
176 |
return $this->run_command(sprintf('chown -R %o %s', $mode, escapeshellarg($file)), true);
|
177 |
}
|
178 |
|
179 |
+
public function owner($file, $owneruid = false) {
|
180 |
if ($owneruid === false) {
|
181 |
$result = $this->link->stat($file);
|
182 |
$owneruid = $result['uid'];
|
190 |
return $ownerarray['name'];
|
191 |
}
|
192 |
|
193 |
+
public function getchmod($file) {
|
194 |
$result = $this->link->stat($file);
|
195 |
|
196 |
return substr(decoct($result['permissions']),3);
|
197 |
}
|
198 |
|
199 |
+
public function group($file, $gid = false) {
|
200 |
if ($gid === false) {
|
201 |
$result = $this->link->stat($file);
|
202 |
$gid = $result['gid'];
|
210 |
return $grouparray['name'];
|
211 |
}
|
212 |
|
213 |
+
public function copy($source, $destination, $overwrite = false, $mode = false) {
|
214 |
if ( ! $overwrite && $this->exists($destination) )
|
215 |
return false;
|
216 |
$content = $this->get_contents($source);
|
219 |
return $this->put_contents($destination, $content, $mode);
|
220 |
}
|
221 |
|
222 |
+
public function move($source, $destination, $overwrite = false) {
|
223 |
return $this->link->rename($source, $destination);
|
224 |
}
|
225 |
|
226 |
+
public function delete($file, $recursive = false, $type = false) {
|
227 |
if ( 'f' == $type || $this->is_file($file) )
|
228 |
return $this->link->delete($file);
|
229 |
if ( ! $recursive )
|
231 |
return $this->link->delete($file, $recursive);
|
232 |
}
|
233 |
|
234 |
+
public function exists($file) {
|
235 |
return $this->link->stat($file) !== false;
|
236 |
}
|
237 |
|
238 |
+
public function is_file($file) {
|
239 |
$result = $this->link->stat($file);
|
240 |
return $result['type'] == NET_SFTP_TYPE_REGULAR;
|
241 |
}
|
242 |
|
243 |
+
public function is_dir($path) {
|
244 |
$result = $this->link->stat($path);
|
245 |
return $result['type'] == NET_SFTP_TYPE_DIRECTORY;
|
246 |
}
|
247 |
|
248 |
+
public function is_readable($file) {
|
249 |
return true;
|
250 |
|
251 |
return is_readable('ssh2.sftp://' . $this->sftp_link . '/' . $file);
|
252 |
}
|
253 |
|
254 |
+
public function is_writable($file) {
|
255 |
return true;
|
256 |
|
257 |
return is_writable('ssh2.sftp://' . $this->sftp_link . '/' . $file);
|
258 |
}
|
259 |
|
260 |
+
public function atime($file) {
|
261 |
$result = $this->link->stat($file);
|
262 |
return $result['atime'];
|
263 |
}
|
264 |
|
265 |
+
public function mtime($file) {
|
266 |
$result = $this->link->stat($file);
|
267 |
return $result['mtime'];
|
268 |
}
|
269 |
|
270 |
+
public function size($file) {
|
271 |
$result = $this->link->stat($file);
|
272 |
return $result['size'];
|
273 |
}
|
274 |
|
275 |
+
public function touch($file, $time = 0, $atime = 0) {
|
276 |
//Not implmented.
|
277 |
}
|
278 |
|
279 |
+
public function mkdir($path, $chmod = false, $chown = false, $chgrp = false) {
|
280 |
$path = untrailingslashit($path);
|
281 |
if ( ! $chmod )
|
282 |
$chmod = FS_CHMOD_DIR;
|
291 |
return true;
|
292 |
}
|
293 |
|
294 |
+
public function rmdir($path, $recursive = false) {
|
295 |
return $this->delete($path, $recursive);
|
296 |
}
|
297 |
|
298 |
+
public function dirlist($path, $include_hidden = true, $recursive = false) {
|
299 |
if ( $this->is_file($path) ) {
|
300 |
$limit_file = basename($path);
|
301 |
$path = dirname($path);
|
phpseclib/Crypt/Base.php
CHANGED
@@ -661,7 +661,7 @@ class Crypt_Base
|
|
661 |
$count = isset($func_args[4]) ? $func_args[4] : 1000;
|
662 |
|
663 |
// Keylength
|
664 |
-
if (isset($func_args[5])) {
|
665 |
$dkLen = $func_args[5];
|
666 |
} else {
|
667 |
$dkLen = $method == 'pbkdf1' ? 2 * $this->key_length : $this->key_length;
|
@@ -696,10 +696,10 @@ class Crypt_Base
|
|
696 |
include_once 'Crypt/Hash.php';
|
697 |
}
|
698 |
$i = 1;
|
|
|
|
|
|
|
699 |
while (strlen($key) < $dkLen) {
|
700 |
-
$hmac = new Crypt_Hash();
|
701 |
-
$hmac->setHash($hash);
|
702 |
-
$hmac->setKey($password);
|
703 |
$f = $u = $hmac->hash($salt . pack('N', $i++));
|
704 |
for ($j = 2; $j <= $count; ++$j) {
|
705 |
$u = $hmac->hash($u);
|
661 |
$count = isset($func_args[4]) ? $func_args[4] : 1000;
|
662 |
|
663 |
// Keylength
|
664 |
+
if (isset($func_args[5]) && $func_args[5] > 0) {
|
665 |
$dkLen = $func_args[5];
|
666 |
} else {
|
667 |
$dkLen = $method == 'pbkdf1' ? 2 * $this->key_length : $this->key_length;
|
696 |
include_once 'Crypt/Hash.php';
|
697 |
}
|
698 |
$i = 1;
|
699 |
+
$hmac = new Crypt_Hash();
|
700 |
+
$hmac->setHash($hash);
|
701 |
+
$hmac->setKey($password);
|
702 |
while (strlen($key) < $dkLen) {
|
|
|
|
|
|
|
703 |
$f = $u = $hmac->hash($salt . pack('N', $i++));
|
704 |
for ($j = 2; $j <= $count; ++$j) {
|
705 |
$u = $hmac->hash($u);
|
phpseclib/Crypt/Hash.php
CHANGED
@@ -126,6 +126,15 @@ class Crypt_Hash
|
|
126 |
*/
|
127 |
var $key = false;
|
128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
/**
|
130 |
* Outer XOR (Internal HMAC)
|
131 |
*
|
@@ -192,6 +201,43 @@ class Crypt_Hash
|
|
192 |
function setKey($key = false)
|
193 |
{
|
194 |
$this->key = $key;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
195 |
}
|
196 |
|
197 |
/**
|
@@ -241,6 +287,25 @@ class Crypt_Hash
|
|
241 |
$this->l = 64;
|
242 |
}
|
243 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
244 |
switch ($hash) {
|
245 |
case 'md2':
|
246 |
$mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ?
|
@@ -267,6 +332,7 @@ class Crypt_Hash
|
|
267 |
default:
|
268 |
$this->hash = MHASH_SHA1;
|
269 |
}
|
|
|
270 |
return;
|
271 |
case CRYPT_HASH_MODE_HASH:
|
272 |
switch ($hash) {
|
@@ -283,35 +349,33 @@ class Crypt_Hash
|
|
283 |
default:
|
284 |
$this->hash = 'sha1';
|
285 |
}
|
|
|
286 |
return;
|
287 |
}
|
288 |
|
289 |
switch ($hash) {
|
290 |
case 'md2':
|
291 |
-
$this->b = 16;
|
292 |
$this->hash = array($this, '_md2');
|
293 |
break;
|
294 |
case 'md5':
|
295 |
-
$this->b = 64;
|
296 |
$this->hash = array($this, '_md5');
|
297 |
break;
|
298 |
case 'sha256':
|
299 |
-
$this->b = 64;
|
300 |
$this->hash = array($this, '_sha256');
|
301 |
break;
|
302 |
case 'sha384':
|
303 |
case 'sha512':
|
304 |
-
$this->b = 128;
|
305 |
$this->hash = array($this, '_sha512');
|
306 |
break;
|
307 |
case 'sha1':
|
308 |
default:
|
309 |
-
$this->b = 64;
|
310 |
$this->hash = array($this, '_sha1');
|
311 |
}
|
312 |
|
313 |
$this->ipad = str_repeat(chr(0x36), $this->b);
|
314 |
$this->opad = str_repeat(chr(0x5C), $this->b);
|
|
|
|
|
315 |
}
|
316 |
|
317 |
/**
|
@@ -328,25 +392,19 @@ class Crypt_Hash
|
|
328 |
if (!empty($this->key) || is_string($this->key)) {
|
329 |
switch ($mode) {
|
330 |
case CRYPT_HASH_MODE_MHASH:
|
331 |
-
$output = mhash($this->hash, $text, $this->
|
332 |
break;
|
333 |
case CRYPT_HASH_MODE_HASH:
|
334 |
-
$output = hash_hmac($this->hash, $text, $this->
|
335 |
break;
|
336 |
case CRYPT_HASH_MODE_INTERNAL:
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
$
|
342 |
-
|
343 |
-
$
|
344 |
-
$temp = $this->ipad ^ $key; // step 2
|
345 |
-
$temp .= $text; // step 3
|
346 |
-
$temp = call_user_func($this->hash, $temp); // step 4
|
347 |
-
$output = $this->opad ^ $key; // step 5
|
348 |
-
$output.= $temp; // step 6
|
349 |
-
$output = call_user_func($this->hash, $output); // step 7
|
350 |
}
|
351 |
} else {
|
352 |
switch ($mode) {
|
126 |
*/
|
127 |
var $key = false;
|
128 |
|
129 |
+
/**
|
130 |
+
* Computed Key
|
131 |
+
*
|
132 |
+
* @see self::_computeKey()
|
133 |
+
* @var string
|
134 |
+
* @access private
|
135 |
+
*/
|
136 |
+
var $computedKey = false;
|
137 |
+
|
138 |
/**
|
139 |
* Outer XOR (Internal HMAC)
|
140 |
*
|
201 |
function setKey($key = false)
|
202 |
{
|
203 |
$this->key = $key;
|
204 |
+
$this->_computeKey();
|
205 |
+
}
|
206 |
+
|
207 |
+
/**
|
208 |
+
* Pre-compute the key used by the HMAC
|
209 |
+
*
|
210 |
+
* Quoting http://tools.ietf.org/html/rfc2104#section-2, "Applications that use keys longer than B bytes
|
211 |
+
* will first hash the key using H and then use the resultant L byte string as the actual key to HMAC."
|
212 |
+
*
|
213 |
+
* As documented in https://www.reddit.com/r/PHP/comments/9nct2l/symfonypolyfill_hash_pbkdf2_correct_fix_for/
|
214 |
+
* when doing an HMAC multiple times it's faster to compute the hash once instead of computing it during
|
215 |
+
* every call
|
216 |
+
*
|
217 |
+
* @access private
|
218 |
+
*/
|
219 |
+
function _computeKey()
|
220 |
+
{
|
221 |
+
if ($this->key === false) {
|
222 |
+
$this->computedKey = false;
|
223 |
+
return;
|
224 |
+
}
|
225 |
+
|
226 |
+
if (strlen($this->key) <= $this->b) {
|
227 |
+
$this->computedKey = $this->key;
|
228 |
+
return;
|
229 |
+
}
|
230 |
+
|
231 |
+
switch ($mode) {
|
232 |
+
case CRYPT_HASH_MODE_MHASH:
|
233 |
+
$this->computedKey = mhash($this->hash, $this->key);
|
234 |
+
break;
|
235 |
+
case CRYPT_HASH_MODE_HASH:
|
236 |
+
$this->computedKey = hash($this->hash, $this->key, true);
|
237 |
+
break;
|
238 |
+
case CRYPT_HASH_MODE_INTERNAL:
|
239 |
+
$this->computedKey = call_user_func($this->hash, $this->key);
|
240 |
+
}
|
241 |
}
|
242 |
|
243 |
/**
|
287 |
$this->l = 64;
|
288 |
}
|
289 |
|
290 |
+
switch ($hash) {
|
291 |
+
case 'md2-96':
|
292 |
+
case 'md2':
|
293 |
+
$this->b = 16;
|
294 |
+
case 'md5-96':
|
295 |
+
case 'sha1-96':
|
296 |
+
case 'sha224-96':
|
297 |
+
case 'sha256-96':
|
298 |
+
case 'md2':
|
299 |
+
case 'md5':
|
300 |
+
case 'sha1':
|
301 |
+
case 'sha224':
|
302 |
+
case 'sha256':
|
303 |
+
$this->b = 64;
|
304 |
+
break;
|
305 |
+
default:
|
306 |
+
$this->b = 128;
|
307 |
+
}
|
308 |
+
|
309 |
switch ($hash) {
|
310 |
case 'md2':
|
311 |
$mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ?
|
332 |
default:
|
333 |
$this->hash = MHASH_SHA1;
|
334 |
}
|
335 |
+
$this->_computeKey();
|
336 |
return;
|
337 |
case CRYPT_HASH_MODE_HASH:
|
338 |
switch ($hash) {
|
349 |
default:
|
350 |
$this->hash = 'sha1';
|
351 |
}
|
352 |
+
$this->_computeKey();
|
353 |
return;
|
354 |
}
|
355 |
|
356 |
switch ($hash) {
|
357 |
case 'md2':
|
|
|
358 |
$this->hash = array($this, '_md2');
|
359 |
break;
|
360 |
case 'md5':
|
|
|
361 |
$this->hash = array($this, '_md5');
|
362 |
break;
|
363 |
case 'sha256':
|
|
|
364 |
$this->hash = array($this, '_sha256');
|
365 |
break;
|
366 |
case 'sha384':
|
367 |
case 'sha512':
|
|
|
368 |
$this->hash = array($this, '_sha512');
|
369 |
break;
|
370 |
case 'sha1':
|
371 |
default:
|
|
|
372 |
$this->hash = array($this, '_sha1');
|
373 |
}
|
374 |
|
375 |
$this->ipad = str_repeat(chr(0x36), $this->b);
|
376 |
$this->opad = str_repeat(chr(0x5C), $this->b);
|
377 |
+
|
378 |
+
$this->_computeKey();
|
379 |
}
|
380 |
|
381 |
/**
|
392 |
if (!empty($this->key) || is_string($this->key)) {
|
393 |
switch ($mode) {
|
394 |
case CRYPT_HASH_MODE_MHASH:
|
395 |
+
$output = mhash($this->hash, $text, $this->computedKey);
|
396 |
break;
|
397 |
case CRYPT_HASH_MODE_HASH:
|
398 |
+
$output = hash_hmac($this->hash, $text, $this->computedKey, true);
|
399 |
break;
|
400 |
case CRYPT_HASH_MODE_INTERNAL:
|
401 |
+
$key = str_pad($this->computedKey, $this->b, chr(0)); // step 1
|
402 |
+
$temp = $this->ipad ^ $key; // step 2
|
403 |
+
$temp .= $text; // step 3
|
404 |
+
$temp = call_user_func($this->hash, $temp); // step 4
|
405 |
+
$output = $this->opad ^ $key; // step 5
|
406 |
+
$output.= $temp; // step 6
|
407 |
+
$output = call_user_func($this->hash, $output); // step 7
|
|
|
|
|
|
|
|
|
|
|
|
|
408 |
}
|
409 |
} else {
|
410 |
switch ($mode) {
|
phpseclib/File/ASN1.php
CHANGED
@@ -390,6 +390,9 @@ class File_ASN1
|
|
390 |
$remainingLength = $length;
|
391 |
while ($remainingLength > 0) {
|
392 |
$temp = $this->_decode_ber($content, $start, $content_pos);
|
|
|
|
|
|
|
393 |
$length = $temp['length'];
|
394 |
// end-of-content octets - see paragraph 8.1.5
|
395 |
if (substr($content, $content_pos + $length, 2) == "\0\0") {
|
@@ -441,6 +444,9 @@ class File_ASN1
|
|
441 |
$current['content'] = substr($content, $content_pos);
|
442 |
} else {
|
443 |
$temp = $this->_decode_ber($content, $start, $content_pos);
|
|
|
|
|
|
|
444 |
$length-= (strlen($content) - $content_pos);
|
445 |
$last = count($temp) - 1;
|
446 |
for ($i = 0; $i < $last; $i++) {
|
@@ -465,6 +471,9 @@ class File_ASN1
|
|
465 |
$length = 0;
|
466 |
while (substr($content, $content_pos, 2) != "\0\0") {
|
467 |
$temp = $this->_decode_ber($content, $length + $start, $content_pos);
|
|
|
|
|
|
|
468 |
$content_pos += $temp['length'];
|
469 |
// all subtags should be octet strings
|
470 |
//if ($temp['type'] != FILE_ASN1_TYPE_OCTET_STRING) {
|
@@ -497,6 +506,9 @@ class File_ASN1
|
|
497 |
break 2;
|
498 |
}
|
499 |
$temp = $this->_decode_ber($content, $start + $offset, $content_pos);
|
|
|
|
|
|
|
500 |
$content_pos += $temp['length'];
|
501 |
$current['content'][] = $temp;
|
502 |
$offset+= $temp['length'];
|
390 |
$remainingLength = $length;
|
391 |
while ($remainingLength > 0) {
|
392 |
$temp = $this->_decode_ber($content, $start, $content_pos);
|
393 |
+
if ($temp === false) {
|
394 |
+
break;
|
395 |
+
}
|
396 |
$length = $temp['length'];
|
397 |
// end-of-content octets - see paragraph 8.1.5
|
398 |
if (substr($content, $content_pos + $length, 2) == "\0\0") {
|
444 |
$current['content'] = substr($content, $content_pos);
|
445 |
} else {
|
446 |
$temp = $this->_decode_ber($content, $start, $content_pos);
|
447 |
+
if ($temp === false) {
|
448 |
+
return false;
|
449 |
+
}
|
450 |
$length-= (strlen($content) - $content_pos);
|
451 |
$last = count($temp) - 1;
|
452 |
for ($i = 0; $i < $last; $i++) {
|
471 |
$length = 0;
|
472 |
while (substr($content, $content_pos, 2) != "\0\0") {
|
473 |
$temp = $this->_decode_ber($content, $length + $start, $content_pos);
|
474 |
+
if ($temp === false) {
|
475 |
+
return false;
|
476 |
+
}
|
477 |
$content_pos += $temp['length'];
|
478 |
// all subtags should be octet strings
|
479 |
//if ($temp['type'] != FILE_ASN1_TYPE_OCTET_STRING) {
|
506 |
break 2;
|
507 |
}
|
508 |
$temp = $this->_decode_ber($content, $start + $offset, $content_pos);
|
509 |
+
if ($temp === false) {
|
510 |
+
return false;
|
511 |
+
}
|
512 |
$content_pos += $temp['length'];
|
513 |
$current['content'][] = $temp;
|
514 |
$offset+= $temp['length'];
|
phpseclib/File/X509.php
CHANGED
@@ -2122,7 +2122,7 @@ class File_X509
|
|
2122 |
*
|
2123 |
* If $date isn't defined it is assumed to be the current date.
|
2124 |
*
|
2125 |
-
* @param int $date optional
|
2126 |
* @access public
|
2127 |
*/
|
2128 |
function validateDate($date = null)
|
@@ -2133,7 +2133,7 @@ class File_X509
|
|
2133 |
|
2134 |
if (!isset($date)) {
|
2135 |
$date = class_exists('DateTime') ?
|
2136 |
-
new DateTime(
|
2137 |
time();
|
2138 |
}
|
2139 |
|
@@ -2143,12 +2143,18 @@ class File_X509
|
|
2143 |
$notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter'];
|
2144 |
$notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime'];
|
2145 |
|
2146 |
-
|
2147 |
-
|
2148 |
-
|
2149 |
-
|
2150 |
-
|
2151 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
2152 |
}
|
2153 |
|
2154 |
switch (true) {
|
2122 |
*
|
2123 |
* If $date isn't defined it is assumed to be the current date.
|
2124 |
*
|
2125 |
+
* @param \DateTime|int|string $date optional
|
2126 |
* @access public
|
2127 |
*/
|
2128 |
function validateDate($date = null)
|
2133 |
|
2134 |
if (!isset($date)) {
|
2135 |
$date = class_exists('DateTime') ?
|
2136 |
+
new DateTime(null, new DateTimeZone(@date_default_timezone_get())) :
|
2137 |
time();
|
2138 |
}
|
2139 |
|
2143 |
$notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter'];
|
2144 |
$notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime'];
|
2145 |
|
2146 |
+
switch (true) {
|
2147 |
+
case is_string($date) && class_exists('DateTime'):
|
2148 |
+
$date = new DateTime($date, new DateTimeZone(@date_default_timezone_get()));
|
2149 |
+
case is_object($date) && strtolower(get_class($date)) == 'datetime':
|
2150 |
+
$notBefore = new DateTime($notBefore, new DateTimeZone(@date_default_timezone_get()));
|
2151 |
+
$notAfter = new DateTime($notAfter, new DateTimeZone(@date_default_timezone_get()));
|
2152 |
+
break;
|
2153 |
+
case is_string($date):
|
2154 |
+
$date = @strtotime($date);
|
2155 |
+
default:
|
2156 |
+
$notBefore = @strtotime($notBefore);
|
2157 |
+
$notAfter = @strtotime($notAfter);
|
2158 |
}
|
2159 |
|
2160 |
switch (true) {
|
phpseclib/Math/BigInteger.php
CHANGED
@@ -65,7 +65,6 @@
|
|
65 |
* @author Jim Wigginton <terrafrost@php.net>
|
66 |
* @copyright 2006 Jim Wigginton
|
67 |
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
68 |
-
* @link http://pear.php.net/package/Math_BigInteger
|
69 |
*/
|
70 |
|
71 |
/**#@+
|
65 |
* @author Jim Wigginton <terrafrost@php.net>
|
66 |
* @copyright 2006 Jim Wigginton
|
67 |
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
|
|
68 |
*/
|
69 |
|
70 |
/**#@+
|
phpseclib/Net/SFTP.php
CHANGED
@@ -919,7 +919,17 @@ class Net_SFTP extends Net_SSH2
|
|
919 |
unset($files[$key]);
|
920 |
continue;
|
921 |
}
|
922 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
923 |
$depth++;
|
924 |
$files[$key] = $this->rawlist($dir . '/' . $key, true);
|
925 |
$depth--;
|
919 |
unset($files[$key]);
|
920 |
continue;
|
921 |
}
|
922 |
+
$is_directory = false;
|
923 |
+
if ($key != '.' && $key != '..') {
|
924 |
+
if ($this->use_stat_cache) {
|
925 |
+
$is_directory = is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)));
|
926 |
+
} else {
|
927 |
+
$stat = $this->lstat($dir . '/' . $key);
|
928 |
+
$is_directory = $stat && $stat['type'] === NET_SFTP_TYPE_DIRECTORY;
|
929 |
+
}
|
930 |
+
}
|
931 |
+
|
932 |
+
if ($is_directory) {
|
933 |
$depth++;
|
934 |
$files[$key] = $this->rawlist($dir . '/' . $key, true);
|
935 |
$depth--;
|
phpseclib/Net/SSH2.php
CHANGED
@@ -923,6 +923,22 @@ class Net_SSH2
|
|
923 |
*/
|
924 |
var $binary_packet_buffer = false;
|
925 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
926 |
/**
|
927 |
* Default Constructor.
|
928 |
*
|
@@ -1159,11 +1175,12 @@ class Net_SSH2
|
|
1159 |
}
|
1160 |
$elapsed = strtok(microtime(), ' ') + strtok('') - $start;
|
1161 |
|
1162 |
-
$this->curTimeout
|
1163 |
-
|
1164 |
-
|
1165 |
-
|
1166 |
-
|
|
|
1167 |
}
|
1168 |
}
|
1169 |
|
@@ -1212,6 +1229,7 @@ class Net_SSH2
|
|
1212 |
}
|
1213 |
|
1214 |
if (feof($this->fsock)) {
|
|
|
1215 |
user_error('Connection closed by server');
|
1216 |
return false;
|
1217 |
}
|
@@ -1223,7 +1241,7 @@ class Net_SSH2
|
|
1223 |
|
1224 |
$this->server_identifier = trim($temp, "\r\n");
|
1225 |
if (strlen($extra)) {
|
1226 |
-
$this->errors[] =
|
1227 |
}
|
1228 |
|
1229 |
if (version_compare($matches[1], '1.99', '<')) {
|
@@ -1238,6 +1256,7 @@ class Net_SSH2
|
|
1238 |
if (!$this->send_kex_first) {
|
1239 |
$response = $this->_get_binary_packet();
|
1240 |
if ($response === false) {
|
|
|
1241 |
user_error('Connection closed by server');
|
1242 |
return false;
|
1243 |
}
|
@@ -1309,6 +1328,8 @@ class Net_SSH2
|
|
1309 |
);
|
1310 |
|
1311 |
static $server_host_key_algorithms = array(
|
|
|
|
|
1312 |
'ssh-rsa', // RECOMMENDED sign Raw RSA Key
|
1313 |
'ssh-dss' // REQUIRED sign Raw DSS Key
|
1314 |
);
|
@@ -1468,6 +1489,7 @@ class Net_SSH2
|
|
1468 |
|
1469 |
$kexinit_payload_server = $this->_get_binary_packet();
|
1470 |
if ($kexinit_payload_server === false) {
|
|
|
1471 |
user_error('Connection closed by server');
|
1472 |
return false;
|
1473 |
}
|
@@ -1595,6 +1617,7 @@ class Net_SSH2
|
|
1595 |
|
1596 |
$response = $this->_get_binary_packet();
|
1597 |
if ($response === false) {
|
|
|
1598 |
user_error('Connection closed by server');
|
1599 |
return false;
|
1600 |
}
|
@@ -1690,12 +1713,14 @@ class Net_SSH2
|
|
1690 |
$data = pack('CNa*', $clientKexInitMessage, strlen($eBytes), $eBytes);
|
1691 |
|
1692 |
if (!$this->_send_binary_packet($data)) {
|
|
|
1693 |
user_error('Connection closed by server');
|
1694 |
return false;
|
1695 |
}
|
1696 |
|
1697 |
$response = $this->_get_binary_packet();
|
1698 |
if ($response === false) {
|
|
|
1699 |
user_error('Connection closed by server');
|
1700 |
return false;
|
1701 |
}
|
@@ -1776,7 +1801,18 @@ class Net_SSH2
|
|
1776 |
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
1777 |
}
|
1778 |
|
1779 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1780 |
user_error('Server Host Key Algorithm Mismatch');
|
1781 |
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
1782 |
}
|
@@ -1793,6 +1829,7 @@ class Net_SSH2
|
|
1793 |
$response = $this->_get_binary_packet();
|
1794 |
|
1795 |
if ($response === false) {
|
|
|
1796 |
user_error('Connection closed by server');
|
1797 |
return false;
|
1798 |
}
|
@@ -1967,7 +2004,7 @@ class Net_SSH2
|
|
1967 |
|
1968 |
if ($this->encrypt) {
|
1969 |
if ($this->crypto_engine) {
|
1970 |
-
$this->encrypt->
|
1971 |
}
|
1972 |
$this->encrypt->enableContinuousBuffer();
|
1973 |
$this->encrypt->disablePadding();
|
@@ -1987,7 +2024,7 @@ class Net_SSH2
|
|
1987 |
|
1988 |
if ($this->decrypt) {
|
1989 |
if ($this->crypto_engine) {
|
1990 |
-
$this->decrypt->
|
1991 |
}
|
1992 |
$this->decrypt->enableContinuousBuffer();
|
1993 |
$this->decrypt->disablePadding();
|
@@ -2191,6 +2228,7 @@ class Net_SSH2
|
|
2191 |
function login($username)
|
2192 |
{
|
2193 |
$args = func_get_args();
|
|
|
2194 |
return call_user_func_array(array(&$this, '_login'), $args);
|
2195 |
}
|
2196 |
|
@@ -2262,6 +2300,7 @@ class Net_SSH2
|
|
2262 |
}
|
2263 |
return $this->_login_helper($username, $password);
|
2264 |
}
|
|
|
2265 |
user_error('Connection closed by server');
|
2266 |
return false;
|
2267 |
}
|
@@ -2318,6 +2357,7 @@ class Net_SSH2
|
|
2318 |
|
2319 |
$response = $this->_get_binary_packet();
|
2320 |
if ($response === false) {
|
|
|
2321 |
user_error('Connection closed by server');
|
2322 |
return false;
|
2323 |
}
|
@@ -2376,6 +2416,7 @@ class Net_SSH2
|
|
2376 |
|
2377 |
$response = $this->_get_binary_packet();
|
2378 |
if ($response === false) {
|
|
|
2379 |
user_error('Connection closed by server');
|
2380 |
return false;
|
2381 |
}
|
@@ -2394,7 +2435,7 @@ class Net_SSH2
|
|
2394 |
return false;
|
2395 |
}
|
2396 |
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
2397 |
-
$this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' .
|
2398 |
return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER);
|
2399 |
case NET_SSH2_MSG_USERAUTH_FAILURE:
|
2400 |
// can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
|
@@ -2476,6 +2517,7 @@ class Net_SSH2
|
|
2476 |
} else {
|
2477 |
$orig = $response = $this->_get_binary_packet();
|
2478 |
if ($response === false) {
|
|
|
2479 |
user_error('Connection closed by server');
|
2480 |
return false;
|
2481 |
}
|
@@ -2664,6 +2706,7 @@ class Net_SSH2
|
|
2664 |
|
2665 |
$response = $this->_get_binary_packet();
|
2666 |
if ($response === false) {
|
|
|
2667 |
user_error('Connection closed by server');
|
2668 |
return false;
|
2669 |
}
|
@@ -2695,8 +2738,23 @@ class Net_SSH2
|
|
2695 |
|
2696 |
$packet = $part1 . chr(1) . $part2;
|
2697 |
$privatekey->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2698 |
$signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet));
|
2699 |
-
$signature = pack('Na*Na*', strlen(
|
2700 |
$packet.= pack('Na*', strlen($signature), $signature);
|
2701 |
|
2702 |
if (!$this->_send_binary_packet($packet)) {
|
@@ -2705,6 +2763,7 @@ class Net_SSH2
|
|
2705 |
|
2706 |
$response = $this->_get_binary_packet();
|
2707 |
if ($response === false) {
|
|
|
2708 |
user_error('Connection closed by server');
|
2709 |
return false;
|
2710 |
}
|
@@ -2831,6 +2890,7 @@ class Net_SSH2
|
|
2831 |
|
2832 |
$response = $this->_get_binary_packet();
|
2833 |
if ($response === false) {
|
|
|
2834 |
user_error('Connection closed by server');
|
2835 |
return false;
|
2836 |
}
|
@@ -2971,6 +3031,7 @@ class Net_SSH2
|
|
2971 |
|
2972 |
$response = $this->_get_binary_packet();
|
2973 |
if ($response === false) {
|
|
|
2974 |
user_error('Connection closed by server');
|
2975 |
return false;
|
2976 |
}
|
@@ -3285,6 +3346,66 @@ class Net_SSH2
|
|
3285 |
return (bool) ($this->bitmap & NET_SSH2_MASK_LOGIN);
|
3286 |
}
|
3287 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3288 |
/**
|
3289 |
* Resets a connection for re-use
|
3290 |
*
|
@@ -3315,8 +3436,8 @@ class Net_SSH2
|
|
3315 |
function _get_binary_packet($skip_channel_filter = false)
|
3316 |
{
|
3317 |
if (!is_resource($this->fsock) || feof($this->fsock)) {
|
3318 |
-
user_error('Connection closed prematurely');
|
3319 |
$this->bitmap = 0;
|
|
|
3320 |
return false;
|
3321 |
}
|
3322 |
|
@@ -3359,8 +3480,8 @@ class Net_SSH2
|
|
3359 |
while ($remaining_length > 0) {
|
3360 |
$temp = fread($this->fsock, $remaining_length);
|
3361 |
if ($temp === false || feof($this->fsock)) {
|
3362 |
-
user_error('Error reading from socket');
|
3363 |
$this->bitmap = 0;
|
|
|
3364 |
return false;
|
3365 |
}
|
3366 |
$buffer.= $temp;
|
@@ -3378,8 +3499,8 @@ class Net_SSH2
|
|
3378 |
if ($this->hmac_check !== false) {
|
3379 |
$hmac = fread($this->fsock, $this->hmac_size);
|
3380 |
if ($hmac === false || strlen($hmac) != $this->hmac_size) {
|
3381 |
-
user_error('Error reading socket');
|
3382 |
$this->bitmap = 0;
|
|
|
3383 |
return false;
|
3384 |
} elseif ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) {
|
3385 |
user_error('Invalid HMAC');
|
@@ -3423,7 +3544,7 @@ class Net_SSH2
|
|
3423 |
return false;
|
3424 |
}
|
3425 |
extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8)));
|
3426 |
-
$this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" .
|
3427 |
$this->bitmap = 0;
|
3428 |
return false;
|
3429 |
case NET_SSH2_MSG_IGNORE:
|
@@ -3435,7 +3556,7 @@ class Net_SSH2
|
|
3435 |
return false;
|
3436 |
}
|
3437 |
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
3438 |
-
$this->errors[] = 'SSH_MSG_DEBUG: ' .
|
3439 |
$payload = $this->_get_binary_packet($skip_channel_filter);
|
3440 |
break;
|
3441 |
case NET_SSH2_MSG_UNIMPLEMENTED:
|
@@ -3458,7 +3579,7 @@ class Net_SSH2
|
|
3458 |
return false;
|
3459 |
}
|
3460 |
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
3461 |
-
$this->banner_message =
|
3462 |
$payload = $this->_get_binary_packet();
|
3463 |
}
|
3464 |
|
@@ -3687,6 +3808,7 @@ class Net_SSH2
|
|
3687 |
|
3688 |
$response = $this->_get_binary_packet(true);
|
3689 |
if ($response === false) {
|
|
|
3690 |
user_error('Connection closed by server');
|
3691 |
return false;
|
3692 |
}
|
@@ -3695,10 +3817,6 @@ class Net_SSH2
|
|
3695 |
if ($client_channel == -1 && $response === true) {
|
3696 |
return true;
|
3697 |
}
|
3698 |
-
if (!strlen($response)) {
|
3699 |
-
return '';
|
3700 |
-
}
|
3701 |
-
|
3702 |
if (!strlen($response)) {
|
3703 |
return false;
|
3704 |
}
|
@@ -4583,6 +4701,8 @@ class Net_SSH2
|
|
4583 |
|
4584 |
break;
|
4585 |
case 'ssh-rsa':
|
|
|
|
|
4586 |
if (strlen($server_public_host_key) < 4) {
|
4587 |
return false;
|
4588 |
}
|
@@ -4609,6 +4729,18 @@ class Net_SSH2
|
|
4609 |
}
|
4610 |
|
4611 |
$rsa = new Crypt_RSA();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4612 |
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
|
4613 |
$rsa->loadKey(array('e' => $e, 'n' => $n), CRYPT_RSA_PUBLIC_FORMAT_RAW);
|
4614 |
if (!$rsa->verify($this->exchange_hash, $signature)) {
|
@@ -4637,7 +4769,30 @@ class Net_SSH2
|
|
4637 |
$s = $s->modPow($e, $n);
|
4638 |
$s = $s->toBytes();
|
4639 |
|
4640 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4641 |
$h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h;
|
4642 |
|
4643 |
if ($s != $h) {
|
923 |
*/
|
924 |
var $binary_packet_buffer = false;
|
925 |
|
926 |
+
/**
|
927 |
+
* Preferred Signature Format
|
928 |
+
*
|
929 |
+
* @var string|false
|
930 |
+
* @access private
|
931 |
+
*/
|
932 |
+
var $preferred_signature_format = false;
|
933 |
+
|
934 |
+
/**
|
935 |
+
* Authentication Credentials
|
936 |
+
*
|
937 |
+
* @var array
|
938 |
+
* @access private
|
939 |
+
*/
|
940 |
+
var $auth = array();
|
941 |
+
|
942 |
/**
|
943 |
* Default Constructor.
|
944 |
*
|
1175 |
}
|
1176 |
$elapsed = strtok(microtime(), ' ') + strtok('') - $start;
|
1177 |
|
1178 |
+
if ($this->curTimeout) {
|
1179 |
+
$this->curTimeout-= $elapsed;
|
1180 |
+
if ($this->curTimeout < 0) {
|
1181 |
+
$this->is_timeout = true;
|
1182 |
+
return false;
|
1183 |
+
}
|
1184 |
}
|
1185 |
}
|
1186 |
|
1229 |
}
|
1230 |
|
1231 |
if (feof($this->fsock)) {
|
1232 |
+
$this->bitmap = 0;
|
1233 |
user_error('Connection closed by server');
|
1234 |
return false;
|
1235 |
}
|
1241 |
|
1242 |
$this->server_identifier = trim($temp, "\r\n");
|
1243 |
if (strlen($extra)) {
|
1244 |
+
$this->errors[] = $extra;
|
1245 |
}
|
1246 |
|
1247 |
if (version_compare($matches[1], '1.99', '<')) {
|
1256 |
if (!$this->send_kex_first) {
|
1257 |
$response = $this->_get_binary_packet();
|
1258 |
if ($response === false) {
|
1259 |
+
$this->bitmap = 0;
|
1260 |
user_error('Connection closed by server');
|
1261 |
return false;
|
1262 |
}
|
1328 |
);
|
1329 |
|
1330 |
static $server_host_key_algorithms = array(
|
1331 |
+
'rsa-sha2-256', // RFC 8332
|
1332 |
+
'rsa-sha2-512', // RFC 8332
|
1333 |
'ssh-rsa', // RECOMMENDED sign Raw RSA Key
|
1334 |
'ssh-dss' // REQUIRED sign Raw DSS Key
|
1335 |
);
|
1489 |
|
1490 |
$kexinit_payload_server = $this->_get_binary_packet();
|
1491 |
if ($kexinit_payload_server === false) {
|
1492 |
+
$this->bitmap = 0;
|
1493 |
user_error('Connection closed by server');
|
1494 |
return false;
|
1495 |
}
|
1617 |
|
1618 |
$response = $this->_get_binary_packet();
|
1619 |
if ($response === false) {
|
1620 |
+
$this->bitmap = 0;
|
1621 |
user_error('Connection closed by server');
|
1622 |
return false;
|
1623 |
}
|
1713 |
$data = pack('CNa*', $clientKexInitMessage, strlen($eBytes), $eBytes);
|
1714 |
|
1715 |
if (!$this->_send_binary_packet($data)) {
|
1716 |
+
$this->bitmap = 0;
|
1717 |
user_error('Connection closed by server');
|
1718 |
return false;
|
1719 |
}
|
1720 |
|
1721 |
$response = $this->_get_binary_packet();
|
1722 |
if ($response === false) {
|
1723 |
+
$this->bitmap = 0;
|
1724 |
user_error('Connection closed by server');
|
1725 |
return false;
|
1726 |
}
|
1801 |
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
1802 |
}
|
1803 |
|
1804 |
+
switch ($server_host_key_algorithm) {
|
1805 |
+
case 'ssh-dss':
|
1806 |
+
$expected_key_format = 'ssh-dss';
|
1807 |
+
break;
|
1808 |
+
//case 'rsa-sha2-256':
|
1809 |
+
//case 'rsa-sha2-512':
|
1810 |
+
//case 'ssh-rsa':
|
1811 |
+
default:
|
1812 |
+
$expected_key_format = 'ssh-rsa';
|
1813 |
+
}
|
1814 |
+
|
1815 |
+
if ($public_key_format != $expected_key_format || $this->signature_format != $server_host_key_algorithm) {
|
1816 |
user_error('Server Host Key Algorithm Mismatch');
|
1817 |
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
1818 |
}
|
1829 |
$response = $this->_get_binary_packet();
|
1830 |
|
1831 |
if ($response === false) {
|
1832 |
+
$this->bitmap = 0;
|
1833 |
user_error('Connection closed by server');
|
1834 |
return false;
|
1835 |
}
|
2004 |
|
2005 |
if ($this->encrypt) {
|
2006 |
if ($this->crypto_engine) {
|
2007 |
+
$this->encrypt->setPreferredEngine($this->crypto_engine);
|
2008 |
}
|
2009 |
$this->encrypt->enableContinuousBuffer();
|
2010 |
$this->encrypt->disablePadding();
|
2024 |
|
2025 |
if ($this->decrypt) {
|
2026 |
if ($this->crypto_engine) {
|
2027 |
+
$this->decrypt->setPreferredEngine($this->crypto_engine);
|
2028 |
}
|
2029 |
$this->decrypt->enableContinuousBuffer();
|
2030 |
$this->decrypt->disablePadding();
|
2228 |
function login($username)
|
2229 |
{
|
2230 |
$args = func_get_args();
|
2231 |
+
$this->auth[] = $args;
|
2232 |
return call_user_func_array(array(&$this, '_login'), $args);
|
2233 |
}
|
2234 |
|
2300 |
}
|
2301 |
return $this->_login_helper($username, $password);
|
2302 |
}
|
2303 |
+
$this->bitmap = 0;
|
2304 |
user_error('Connection closed by server');
|
2305 |
return false;
|
2306 |
}
|
2357 |
|
2358 |
$response = $this->_get_binary_packet();
|
2359 |
if ($response === false) {
|
2360 |
+
$this->bitmap = 0;
|
2361 |
user_error('Connection closed by server');
|
2362 |
return false;
|
2363 |
}
|
2416 |
|
2417 |
$response = $this->_get_binary_packet();
|
2418 |
if ($response === false) {
|
2419 |
+
$this->bitmap = 0;
|
2420 |
user_error('Connection closed by server');
|
2421 |
return false;
|
2422 |
}
|
2435 |
return false;
|
2436 |
}
|
2437 |
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
2438 |
+
$this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . $this->_string_shift($response, $length);
|
2439 |
return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER);
|
2440 |
case NET_SSH2_MSG_USERAUTH_FAILURE:
|
2441 |
// can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
|
2517 |
} else {
|
2518 |
$orig = $response = $this->_get_binary_packet();
|
2519 |
if ($response === false) {
|
2520 |
+
$this->bitmap = 0;
|
2521 |
user_error('Connection closed by server');
|
2522 |
return false;
|
2523 |
}
|
2706 |
|
2707 |
$response = $this->_get_binary_packet();
|
2708 |
if ($response === false) {
|
2709 |
+
$this->bitmap = 0;
|
2710 |
user_error('Connection closed by server');
|
2711 |
return false;
|
2712 |
}
|
2738 |
|
2739 |
$packet = $part1 . chr(1) . $part2;
|
2740 |
$privatekey->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
|
2741 |
+
switch ($this->signature_format) {
|
2742 |
+
case 'rsa-sha2-512':
|
2743 |
+
$hash = 'sha512';
|
2744 |
+
$type = 'rsa-sha2-512';
|
2745 |
+
break;
|
2746 |
+
case 'rsa-sha2-256':
|
2747 |
+
$hash = 'sha256';
|
2748 |
+
$type = 'rsa-sha2-256';
|
2749 |
+
break;
|
2750 |
+
//case 'ssh-rsa':
|
2751 |
+
default:
|
2752 |
+
$hash = 'sha1';
|
2753 |
+
$type = 'ssh-rsa';
|
2754 |
+
}
|
2755 |
+
$privatekey->setHash($hash);
|
2756 |
$signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet));
|
2757 |
+
$signature = pack('Na*Na*', strlen($type), $type, strlen($signature), $signature);
|
2758 |
$packet.= pack('Na*', strlen($signature), $signature);
|
2759 |
|
2760 |
if (!$this->_send_binary_packet($packet)) {
|
2763 |
|
2764 |
$response = $this->_get_binary_packet();
|
2765 |
if ($response === false) {
|
2766 |
+
$this->bitmap = 0;
|
2767 |
user_error('Connection closed by server');
|
2768 |
return false;
|
2769 |
}
|
2890 |
|
2891 |
$response = $this->_get_binary_packet();
|
2892 |
if ($response === false) {
|
2893 |
+
$this->bitmap = 0;
|
2894 |
user_error('Connection closed by server');
|
2895 |
return false;
|
2896 |
}
|
3031 |
|
3032 |
$response = $this->_get_binary_packet();
|
3033 |
if ($response === false) {
|
3034 |
+
$this->bitmap = 0;
|
3035 |
user_error('Connection closed by server');
|
3036 |
return false;
|
3037 |
}
|
3346 |
return (bool) ($this->bitmap & NET_SSH2_MASK_LOGIN);
|
3347 |
}
|
3348 |
|
3349 |
+
/**
|
3350 |
+
* Pings a server connection, or tries to reconnect if the connection has gone down
|
3351 |
+
*
|
3352 |
+
* Inspired by http://php.net/manual/en/mysqli.ping.php
|
3353 |
+
*
|
3354 |
+
* @return bool
|
3355 |
+
* @access public
|
3356 |
+
*/
|
3357 |
+
function ping()
|
3358 |
+
{
|
3359 |
+
if (!$this->isAuthenticated()) {
|
3360 |
+
return false;
|
3361 |
+
}
|
3362 |
+
|
3363 |
+
$this->window_size_server_to_client[NET_SSH2_CHANNEL_KEEP_ALIVE] = $this->window_size;
|
3364 |
+
$packet_size = 0x4000;
|
3365 |
+
$packet = pack(
|
3366 |
+
'CNa*N3',
|
3367 |
+
NET_SSH2_MSG_CHANNEL_OPEN,
|
3368 |
+
strlen('session'),
|
3369 |
+
'session',
|
3370 |
+
NET_SSH2_CHANNEL_KEEP_ALIVE,
|
3371 |
+
$this->window_size_server_to_client[NET_SSH2_CHANNEL_KEEP_ALIVE],
|
3372 |
+
$packet_size
|
3373 |
+
);
|
3374 |
+
|
3375 |
+
if (!@$this->_send_binary_packet($packet)) {
|
3376 |
+
return $this->_reconnect();
|
3377 |
+
}
|
3378 |
+
|
3379 |
+
$this->channel_status[NET_SSH2_CHANNEL_KEEP_ALIVE] = NET_SSH2_MSG_CHANNEL_OPEN;
|
3380 |
+
|
3381 |
+
$response = @$this->_get_channel_packet(NET_SSH2_CHANNEL_KEEP_ALIVE);
|
3382 |
+
if ($response !== false) {
|
3383 |
+
$this->_close_channel(NET_SSH2_CHANNEL_KEEP_ALIVE);
|
3384 |
+
return true;
|
3385 |
+
}
|
3386 |
+
|
3387 |
+
return $this->_reconnect();
|
3388 |
+
}
|
3389 |
+
|
3390 |
+
/**
|
3391 |
+
* In situ reconnect method
|
3392 |
+
*
|
3393 |
+
* @return boolean
|
3394 |
+
* @access private
|
3395 |
+
*/
|
3396 |
+
function _reconnect()
|
3397 |
+
{
|
3398 |
+
$this->_reset_connection(NET_SSH2_DISCONNECT_CONNECTION_LOST);
|
3399 |
+
$this->retry_connect = true;
|
3400 |
+
if (!$this->_connect()) {
|
3401 |
+
return false;
|
3402 |
+
}
|
3403 |
+
foreach ($this->auth as $auth) {
|
3404 |
+
$result = call_user_func_array(array(&$this, 'parent::login'), $auth);
|
3405 |
+
}
|
3406 |
+
return $result;
|
3407 |
+
}
|
3408 |
+
|
3409 |
/**
|
3410 |
* Resets a connection for re-use
|
3411 |
*
|
3436 |
function _get_binary_packet($skip_channel_filter = false)
|
3437 |
{
|
3438 |
if (!is_resource($this->fsock) || feof($this->fsock)) {
|
|
|
3439 |
$this->bitmap = 0;
|
3440 |
+
user_error('Connection closed prematurely');
|
3441 |
return false;
|
3442 |
}
|
3443 |
|
3480 |
while ($remaining_length > 0) {
|
3481 |
$temp = fread($this->fsock, $remaining_length);
|
3482 |
if ($temp === false || feof($this->fsock)) {
|
|
|
3483 |
$this->bitmap = 0;
|
3484 |
+
user_error('Error reading from socket');
|
3485 |
return false;
|
3486 |
}
|
3487 |
$buffer.= $temp;
|
3499 |
if ($this->hmac_check !== false) {
|
3500 |
$hmac = fread($this->fsock, $this->hmac_size);
|
3501 |
if ($hmac === false || strlen($hmac) != $this->hmac_size) {
|
|
|
3502 |
$this->bitmap = 0;
|
3503 |
+
user_error('Error reading socket');
|
3504 |
return false;
|
3505 |
} elseif ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) {
|
3506 |
user_error('Invalid HMAC');
|
3544 |
return false;
|
3545 |
}
|
3546 |
extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8)));
|
3547 |
+
$this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . $this->_string_shift($payload, $length);
|
3548 |
$this->bitmap = 0;
|
3549 |
return false;
|
3550 |
case NET_SSH2_MSG_IGNORE:
|
3556 |
return false;
|
3557 |
}
|
3558 |
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
3559 |
+
$this->errors[] = 'SSH_MSG_DEBUG: ' . $this->_string_shift($payload, $length);
|
3560 |
$payload = $this->_get_binary_packet($skip_channel_filter);
|
3561 |
break;
|
3562 |
case NET_SSH2_MSG_UNIMPLEMENTED:
|
3579 |
return false;
|
3580 |
}
|
3581 |
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
3582 |
+
$this->banner_message = $this->_string_shift($payload, $length);
|
3583 |
$payload = $this->_get_binary_packet();
|
3584 |
}
|
3585 |
|
3808 |
|
3809 |
$response = $this->_get_binary_packet(true);
|
3810 |
if ($response === false) {
|
3811 |
+
$this->bitmap = 0;
|
3812 |
user_error('Connection closed by server');
|
3813 |
return false;
|
3814 |
}
|
3817 |
if ($client_channel == -1 && $response === true) {
|
3818 |
return true;
|
3819 |
}
|
|
|
|
|
|
|
|
|
3820 |
if (!strlen($response)) {
|
3821 |
return false;
|
3822 |
}
|
4701 |
|
4702 |
break;
|
4703 |
case 'ssh-rsa':
|
4704 |
+
case 'rsa-sha2-256':
|
4705 |
+
case 'rsa-sha2-512':
|
4706 |
if (strlen($server_public_host_key) < 4) {
|
4707 |
return false;
|
4708 |
}
|
4729 |
}
|
4730 |
|
4731 |
$rsa = new Crypt_RSA();
|
4732 |
+
switch ($this->signature_format) {
|
4733 |
+
case 'rsa-sha2-512':
|
4734 |
+
$hash = 'sha512';
|
4735 |
+
break;
|
4736 |
+
case 'rsa-sha2-256':
|
4737 |
+
$hash = 'sha256';
|
4738 |
+
break;
|
4739 |
+
//case 'ssh-rsa':
|
4740 |
+
default:
|
4741 |
+
$hash = 'sha1';
|
4742 |
+
}
|
4743 |
+
$rsa->setHash($hash);
|
4744 |
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
|
4745 |
$rsa->loadKey(array('e' => $e, 'n' => $n), CRYPT_RSA_PUBLIC_FORMAT_RAW);
|
4746 |
if (!$rsa->verify($this->exchange_hash, $signature)) {
|
4769 |
$s = $s->modPow($e, $n);
|
4770 |
$s = $s->toBytes();
|
4771 |
|
4772 |
+
switch ($this->signature_format) {
|
4773 |
+
case 'rsa-sha2-512':
|
4774 |
+
$hash = 'sha512';
|
4775 |
+
break;
|
4776 |
+
case 'rsa-sha2-256':
|
4777 |
+
$hash = 'sha256';
|
4778 |
+
break;
|
4779 |
+
//case 'ssh-rsa':
|
4780 |
+
default:
|
4781 |
+
$hash = 'sha1';
|
4782 |
+
}
|
4783 |
+
$hashObj = new Crypt_Hash($hash);
|
4784 |
+
switch ($this->signature_format) {
|
4785 |
+
case 'rsa-sha2-512':
|
4786 |
+
$h = pack('N5a*', 0x00305130, 0x0D060960, 0x86480165, 0x03040203, 0x05000440, $hashObj->hash($this->exchange_hash));
|
4787 |
+
break;
|
4788 |
+
case 'rsa-sha2-256':
|
4789 |
+
$h = pack('N5a*', 0x00303130, 0x0D060960, 0x86480165, 0x03040201, 0x05000420, $hashObj->hash($this->exchange_hash));
|
4790 |
+
break;
|
4791 |
+
//case 'ssh-rsa':
|
4792 |
+
default:
|
4793 |
+
$hash = 'sha1';
|
4794 |
+
$h = pack('N4a*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, $hashObj->hash($this->exchange_hash));
|
4795 |
+
}
|
4796 |
$h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h;
|
4797 |
|
4798 |
if ($s != $h) {
|
phpseclib/System/SSH/Agent.php
CHANGED
@@ -202,6 +202,18 @@ class System_SSH_Agent_Identity
|
|
202 |
{
|
203 |
}
|
204 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
205 |
/**
|
206 |
* Create a signature
|
207 |
*
|
@@ -330,12 +342,14 @@ class System_SSH_Agent
|
|
330 |
$packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES);
|
331 |
if (strlen($packet) != fputs($this->fsock, $packet)) {
|
332 |
user_error('Connection closed while requesting identities');
|
|
|
333 |
}
|
334 |
|
335 |
$length = current(unpack('N', fread($this->fsock, 4)));
|
336 |
$type = ord(fread($this->fsock, 1));
|
337 |
if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) {
|
338 |
user_error('Unable to request identities');
|
|
|
339 |
}
|
340 |
|
341 |
$identities = array();
|
202 |
{
|
203 |
}
|
204 |
|
205 |
+
/**
|
206 |
+
* Set Hash
|
207 |
+
*
|
208 |
+
* ssh-agent doesn't support using hashes for RSA other than SHA1
|
209 |
+
*
|
210 |
+
* @param string $hash
|
211 |
+
* @access public
|
212 |
+
*/
|
213 |
+
function setHash($hash)
|
214 |
+
{
|
215 |
+
}
|
216 |
+
|
217 |
/**
|
218 |
* Create a signature
|
219 |
*
|
342 |
$packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES);
|
343 |
if (strlen($packet) != fputs($this->fsock, $packet)) {
|
344 |
user_error('Connection closed while requesting identities');
|
345 |
+
return array();
|
346 |
}
|
347 |
|
348 |
$length = current(unpack('N', fread($this->fsock, 4)));
|
349 |
$type = ord(fread($this->fsock, 1));
|
350 |
if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) {
|
351 |
user_error('Unable to request identities');
|
352 |
+
return array();
|
353 |
}
|
354 |
|
355 |
$identities = array();
|
readme.txt
CHANGED
@@ -4,13 +4,19 @@ Donate link: http://sourceforge.net/donate/index.php?group_id=198487
|
|
4 |
Tags: ssh, sftp
|
5 |
Requires at least: 3.1
|
6 |
Tested up to: 5.0
|
7 |
-
Stable tag: 0.7.
|
8 |
|
9 |
"SSH SFTP Updater Support" is the easiest way to keep your Wordpress installation up-to-date with SFTP.
|
10 |
|
11 |
== Description ==
|
12 |
|
13 |
-
Keeping your Wordpress install up-to-date and installing plugins in a hassle-free manner is not so easy if your server uses SFTP. "SSH SFTP Updater Support" for
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
|
15 |
This plugin is offered and maintained as a free service to the WP community. You might also be interested in enhancing your WordPress site with our other top plugins, below.
|
16 |
|
@@ -24,10 +30,20 @@ This plugin is offered and maintained as a free service to the WP community. You
|
|
24 |
== Installation ==
|
25 |
|
26 |
1. Upload the files to the `/wp-content/plugins/ssh-sftp-updater-support` directory
|
|
|
27 |
2. Activate the plugin through the 'Plugins' menu in WordPress
|
28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
== Changelog ==
|
30 |
|
|
|
|
|
|
|
31 |
= 0.7.5 - 2018/Oct/13 =
|
32 |
|
33 |
* TWEAK: Replace use of the submit_button() function (one user was seeing a fatal error related to it)
|
@@ -84,4 +100,4 @@ This plugin is offered and maintained as a free service to the WP community. You
|
|
84 |
* Initial Release
|
85 |
|
86 |
== Upgrade Notice ==
|
87 |
-
* 0.7.
|
4 |
Tags: ssh, sftp
|
5 |
Requires at least: 3.1
|
6 |
Tested up to: 5.0
|
7 |
+
Stable tag: 0.7.6
|
8 |
|
9 |
"SSH SFTP Updater Support" is the easiest way to keep your Wordpress installation up-to-date with SFTP.
|
10 |
|
11 |
== Description ==
|
12 |
|
13 |
+
Keeping your Wordpress install up-to-date and installing plugins in a hassle-free manner is not so easy if your server uses SFTP. "SSH SFTP Updater Support" for WordPress uses phpseclib to remedy this deficiency.
|
14 |
+
|
15 |
+
To use it, after installing and activating the plugins, add the necessary constants early in the code in your wp-config.php:
|
16 |
+
|
17 |
+
a) `define('FS_METHOD', 'ssh2');`
|
18 |
+
|
19 |
+
b) Others as <a href="https://codex.wordpress.org/Editing_wp-config.php#WordPress_Upgrade_Constants">detailed in the official WP codex</a>
|
20 |
|
21 |
This plugin is offered and maintained as a free service to the WP community. You might also be interested in enhancing your WordPress site with our other top plugins, below.
|
22 |
|
30 |
== Installation ==
|
31 |
|
32 |
1. Upload the files to the `/wp-content/plugins/ssh-sftp-updater-support` directory
|
33 |
+
|
34 |
2. Activate the plugin through the 'Plugins' menu in WordPress
|
35 |
|
36 |
+
3. Add the necessary constants early in the code in your wp-config.php:
|
37 |
+
|
38 |
+
a) `define('FS_METHOD', 'ssh2');`
|
39 |
+
|
40 |
+
b) Others as <a href="https://codex.wordpress.org/Editing_wp-config.php#WordPress_Upgrade_Constants">detailed in the official WP codex</a>
|
41 |
+
|
42 |
== Changelog ==
|
43 |
|
44 |
+
* TWEAK: Clarify the installation instructions
|
45 |
+
* TWEAK: Add function visibility markers throughout WP_Filesystem_SSH2
|
46 |
+
|
47 |
= 0.7.5 - 2018/Oct/13 =
|
48 |
|
49 |
* TWEAK: Replace use of the submit_button() function (one user was seeing a fatal error related to it)
|
100 |
* Initial Release
|
101 |
|
102 |
== Upgrade Notice ==
|
103 |
+
* 0.7.6: Documentation improvement and small code tidy
|
sftp.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
Plugin Name: SSH SFTP Updater Support
|
4 |
Plugin URI: https://wordpress.org/plugins/ssh-sftp-updater-support/
|
5 |
Description: Update your WordPress blog / plugins via SFTP without libssh2
|
6 |
-
Version: 0.7.
|
7 |
Author: TerraFrost, David Anderson + Team Updraft
|
8 |
Author URI: https://updraftplus.com/
|
9 |
*/
|
@@ -12,21 +12,22 @@ if (!defined('ABSPATH')) die('No direct access allowed');
|
|
12 |
|
13 |
define('SSH_SFTP_UPDATER_SUPPORT_MAIN_PATH', plugin_dir_path(__FILE__));
|
14 |
define('SSH_SFTP_UPDATER_SUPPORT_BASENAME', plugin_basename(__FILE__));
|
15 |
-
define('SSH_SFTP_UPDATER_SUPPORT_VERSION', '0.7.
|
16 |
define('SSH_SFTP_UPDATER_SUPPORT_URL', plugin_dir_url(__FILE__));
|
17 |
// see http://adambrown.info/p/wp_hooks/hook/<filter name>
|
18 |
add_filter('filesystem_method', 'phpseclib_filesystem_method', 10, 2); // since 2.6 - WordPress will ignore the ssh option if the php ssh extension is not loaded
|
19 |
add_filter('request_filesystem_credentials', 'phpseclib_request_filesystem_credentials', 10, 1024); // since 2.5 - Alter some strings and don't ask for the public key
|
20 |
add_filter('fs_ftp_connection_types', 'phpseclib_fs_ftp_connection_types'); // since 2.9 - Add the SSH2 option to the connection options
|
21 |
add_filter('filesystem_method_file', 'phpseclib_filesystem_method_file', 10, 2); // since 2.6 - Direct WordPress to use our ssh2 class
|
22 |
-
|
23 |
-
|
|
|
24 |
|
25 |
function phpseclib_disable_update_link_onclick() {
|
26 |
?>
|
27 |
-
<script
|
28 |
-
jQuery(function($){
|
29 |
-
|
30 |
});
|
31 |
</script>
|
32 |
<?php
|
@@ -38,8 +39,11 @@ function phpseclib_filesystem_method_file($path, $method) {
|
|
38 |
$path;
|
39 |
}
|
40 |
|
|
|
|
|
|
|
41 |
function phpseclib_filesystem_method($method, $args) {
|
42 |
-
return (
|
43 |
}
|
44 |
|
45 |
function phpseclib_fs_ftp_connection_types($types) {
|
@@ -275,6 +279,9 @@ class SSH_SFTP_Updater_Support {
|
|
275 |
|
276 |
protected static $_notices_instance = null;
|
277 |
|
|
|
|
|
|
|
278 |
public function __construct() {
|
279 |
add_action('plugins_loaded', array($this, 'plugins_loaded'), 1);
|
280 |
add_action('admin_init', array($this, 'admin_init'));
|
3 |
Plugin Name: SSH SFTP Updater Support
|
4 |
Plugin URI: https://wordpress.org/plugins/ssh-sftp-updater-support/
|
5 |
Description: Update your WordPress blog / plugins via SFTP without libssh2
|
6 |
+
Version: 0.7.6
|
7 |
Author: TerraFrost, David Anderson + Team Updraft
|
8 |
Author URI: https://updraftplus.com/
|
9 |
*/
|
12 |
|
13 |
define('SSH_SFTP_UPDATER_SUPPORT_MAIN_PATH', plugin_dir_path(__FILE__));
|
14 |
define('SSH_SFTP_UPDATER_SUPPORT_BASENAME', plugin_basename(__FILE__));
|
15 |
+
define('SSH_SFTP_UPDATER_SUPPORT_VERSION', '0.7.6');
|
16 |
define('SSH_SFTP_UPDATER_SUPPORT_URL', plugin_dir_url(__FILE__));
|
17 |
// see http://adambrown.info/p/wp_hooks/hook/<filter name>
|
18 |
add_filter('filesystem_method', 'phpseclib_filesystem_method', 10, 2); // since 2.6 - WordPress will ignore the ssh option if the php ssh extension is not loaded
|
19 |
add_filter('request_filesystem_credentials', 'phpseclib_request_filesystem_credentials', 10, 1024); // since 2.5 - Alter some strings and don't ask for the public key
|
20 |
add_filter('fs_ftp_connection_types', 'phpseclib_fs_ftp_connection_types'); // since 2.9 - Add the SSH2 option to the connection options
|
21 |
add_filter('filesystem_method_file', 'phpseclib_filesystem_method_file', 10, 2); // since 2.6 - Direct WordPress to use our ssh2 class
|
22 |
+
|
23 |
+
// disable the modal dialog on WordPress >= 4.2
|
24 |
+
if (version_compare(get_bloginfo('version'), '4.2.0', '>=')) add_action('admin_head-plugins.php', 'phpseclib_disable_update_link_onclick');
|
25 |
|
26 |
function phpseclib_disable_update_link_onclick() {
|
27 |
?>
|
28 |
+
<script>
|
29 |
+
jQuery(function($) {
|
30 |
+
$(".plugin-update-tr").off("click", ".update-link");
|
31 |
});
|
32 |
</script>
|
33 |
<?php
|
39 |
$path;
|
40 |
}
|
41 |
|
42 |
+
/**
|
43 |
+
* Used by the WP filter phpseclib_filesystem_method
|
44 |
+
*/
|
45 |
function phpseclib_filesystem_method($method, $args) {
|
46 |
+
return (isset($args['connection_type']) && 'ssh' == $args['connection_type']) ? 'ssh2' : $method;
|
47 |
}
|
48 |
|
49 |
function phpseclib_fs_ftp_connection_types($types) {
|
279 |
|
280 |
protected static $_notices_instance = null;
|
281 |
|
282 |
+
/**
|
283 |
+
* Constructor
|
284 |
+
*/
|
285 |
public function __construct() {
|
286 |
add_action('plugins_loaded', array($this, 'plugins_loaded'), 1);
|
287 |
add_action('admin_init', array($this, 'admin_init'));
|