updated composer dependencies
This commit is contained in:
parent
a1103170cb
commit
dd7064d9e4
|
@ -237,16 +237,16 @@
|
|||
},
|
||||
{
|
||||
"name": "phpseclib/phpseclib",
|
||||
"version": "2.0.4",
|
||||
"version": "2.0.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpseclib/phpseclib.git",
|
||||
"reference": "ab8028c93c03cc8d9c824efa75dc94f1db2369bf"
|
||||
"reference": "34a7699e6f31b1ef4035ee36444407cecf9f56aa"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/ab8028c93c03cc8d9c824efa75dc94f1db2369bf",
|
||||
"reference": "ab8028c93c03cc8d9c824efa75dc94f1db2369bf",
|
||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34a7699e6f31b1ef4035ee36444407cecf9f56aa",
|
||||
"reference": "34a7699e6f31b1ef4035ee36444407cecf9f56aa",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -325,20 +325,20 @@
|
|||
"x.509",
|
||||
"x509"
|
||||
],
|
||||
"time": "2016-10-04T00:57:04+00:00"
|
||||
"time": "2017-06-05T06:31:10+00:00"
|
||||
},
|
||||
{
|
||||
"name": "simplepie/simplepie",
|
||||
"version": "1.4.3",
|
||||
"version": "1.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/simplepie/simplepie.git",
|
||||
"reference": "2a24b6e74aa9bf33243020f52895fe77efe94ccf"
|
||||
"reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/simplepie/simplepie/zipball/2a24b6e74aa9bf33243020f52895fe77efe94ccf",
|
||||
"reference": "2a24b6e74aa9bf33243020f52895fe77efe94ccf",
|
||||
"url": "https://api.github.com/repos/simplepie/simplepie/zipball/5de5551953f95feef12cf355a7a26a70f94aa3ab",
|
||||
"reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -385,20 +385,20 @@
|
|||
"feeds",
|
||||
"rss"
|
||||
],
|
||||
"time": "2016-11-27T01:39:18+00:00"
|
||||
"time": "2017-04-17T07:29:31+00:00"
|
||||
},
|
||||
{
|
||||
"name": "splitbrain/php-archive",
|
||||
"version": "1.0.8",
|
||||
"version": "1.0.9",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/splitbrain/php-archive.git",
|
||||
"reference": "6b1c1746fa0a6f9f68f0bc832892ddeda8db905c"
|
||||
"reference": "2a63b8cf0bfc7fdc0d987c9b7348e639e55cce76"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/splitbrain/php-archive/zipball/6b1c1746fa0a6f9f68f0bc832892ddeda8db905c",
|
||||
"reference": "6b1c1746fa0a6f9f68f0bc832892ddeda8db905c",
|
||||
"url": "https://api.github.com/repos/splitbrain/php-archive/zipball/2a63b8cf0bfc7fdc0d987c9b7348e639e55cce76",
|
||||
"reference": "2a63b8cf0bfc7fdc0d987c9b7348e639e55cce76",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -436,7 +436,7 @@
|
|||
"unzip",
|
||||
"zip"
|
||||
],
|
||||
"time": "2017-03-19T09:10:53+00:00"
|
||||
"time": "2017-06-11T06:11:38+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
|
|
|
@ -6,6 +6,6 @@ $vendorDir = dirname(dirname(__FILE__));
|
|||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
|
||||
'5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
|
||||
'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
|
||||
);
|
||||
|
|
|
@ -7,8 +7,8 @@ namespace Composer\Autoload;
|
|||
class ComposerStaticInita19a915ee98347a0c787119619d2ff9b
|
||||
{
|
||||
public static $files = array (
|
||||
'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
|
||||
'5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
|
||||
'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
|
||||
);
|
||||
|
||||
public static $prefixLengthsPsr4 = array (
|
||||
|
|
|
@ -1,160 +1,4 @@
|
|||
[
|
||||
{
|
||||
"name": "phpseclib/phpseclib",
|
||||
"version": "2.0.4",
|
||||
"version_normalized": "2.0.4.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpseclib/phpseclib.git",
|
||||
"reference": "ab8028c93c03cc8d9c824efa75dc94f1db2369bf"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/ab8028c93c03cc8d9c824efa75dc94f1db2369bf",
|
||||
"reference": "ab8028c93c03cc8d9c824efa75dc94f1db2369bf",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phing/phing": "~2.7",
|
||||
"phpunit/phpunit": "~4.0",
|
||||
"sami/sami": "~2.0",
|
||||
"squizlabs/php_codesniffer": "~2.0"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
|
||||
"ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
|
||||
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
|
||||
"ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
|
||||
},
|
||||
"time": "2016-10-04T00:57:04+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"phpseclib/bootstrap.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"phpseclib\\": "phpseclib/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jim Wigginton",
|
||||
"email": "terrafrost@php.net",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "Patrick Monnerat",
|
||||
"email": "pm@datasphere.ch",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Andreas Fischer",
|
||||
"email": "bantu@phpbb.com",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Hans-Jürgen Petrich",
|
||||
"email": "petrich@tronic-media.com",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Graham Campbell",
|
||||
"email": "graham@alt-three.com",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
|
||||
"homepage": "http://phpseclib.sourceforge.net",
|
||||
"keywords": [
|
||||
"BigInteger",
|
||||
"aes",
|
||||
"asn.1",
|
||||
"asn1",
|
||||
"blowfish",
|
||||
"crypto",
|
||||
"cryptography",
|
||||
"encryption",
|
||||
"rsa",
|
||||
"security",
|
||||
"sftp",
|
||||
"signature",
|
||||
"signing",
|
||||
"ssh",
|
||||
"twofish",
|
||||
"x.509",
|
||||
"x509"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "simplepie/simplepie",
|
||||
"version": "1.4.3",
|
||||
"version_normalized": "1.4.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/simplepie/simplepie.git",
|
||||
"reference": "2a24b6e74aa9bf33243020f52895fe77efe94ccf"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/simplepie/simplepie/zipball/2a24b6e74aa9bf33243020f52895fe77efe94ccf",
|
||||
"reference": "2a24b6e74aa9bf33243020f52895fe77efe94ccf",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4 || ~5"
|
||||
},
|
||||
"suggest": {
|
||||
"mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
|
||||
},
|
||||
"time": "2016-11-27T01:39:18+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"SimplePie": "library"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Ryan Parman",
|
||||
"homepage": "http://ryanparman.com/",
|
||||
"role": "Creator, alumnus developer"
|
||||
},
|
||||
{
|
||||
"name": "Geoffrey Sneddon",
|
||||
"homepage": "http://gsnedders.com/",
|
||||
"role": "Alumnus developer"
|
||||
},
|
||||
{
|
||||
"name": "Ryan McCue",
|
||||
"email": "me@ryanmccue.info",
|
||||
"homepage": "http://ryanmccue.info/",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "A simple Atom/RSS parsing library for PHP",
|
||||
"homepage": "http://simplepie.org/",
|
||||
"keywords": [
|
||||
"atom",
|
||||
"feeds",
|
||||
"rss"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "paragonie/random_compat",
|
||||
"version": "v2.0.10",
|
||||
|
@ -205,59 +49,6 @@
|
|||
"random"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "splitbrain/php-archive",
|
||||
"version": "1.0.8",
|
||||
"version_normalized": "1.0.8.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/splitbrain/php-archive.git",
|
||||
"reference": "6b1c1746fa0a6f9f68f0bc832892ddeda8db905c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/splitbrain/php-archive/zipball/6b1c1746fa0a6f9f68f0bc832892ddeda8db905c",
|
||||
"reference": "6b1c1746fa0a6f9f68f0bc832892ddeda8db905c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "4.5.*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-iconv": "Used for proper filename encode handling",
|
||||
"ext-mbstring": "Can be used alternatively for handling filename encoding"
|
||||
},
|
||||
"time": "2017-03-19T09:10:53+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"splitbrain\\PHPArchive\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Andreas Gohr",
|
||||
"email": "andi@splitbrain.org"
|
||||
}
|
||||
],
|
||||
"description": "Pure-PHP implementation to read and write TAR and ZIP archives",
|
||||
"keywords": [
|
||||
"archive",
|
||||
"extract",
|
||||
"tar",
|
||||
"unpack",
|
||||
"unzip",
|
||||
"zip"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "geshi/geshi",
|
||||
"version": "v1.0.9.0",
|
||||
|
@ -446,5 +237,214 @@
|
|||
],
|
||||
"description": "lesserphp is a compiler for LESS written in PHP based on leafo's lessphp.",
|
||||
"homepage": "http://leafo.net/lessphp/"
|
||||
},
|
||||
{
|
||||
"name": "splitbrain/php-archive",
|
||||
"version": "1.0.9",
|
||||
"version_normalized": "1.0.9.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/splitbrain/php-archive.git",
|
||||
"reference": "2a63b8cf0bfc7fdc0d987c9b7348e639e55cce76"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/splitbrain/php-archive/zipball/2a63b8cf0bfc7fdc0d987c9b7348e639e55cce76",
|
||||
"reference": "2a63b8cf0bfc7fdc0d987c9b7348e639e55cce76",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "4.5.*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-iconv": "Used for proper filename encode handling",
|
||||
"ext-mbstring": "Can be used alternatively for handling filename encoding"
|
||||
},
|
||||
"time": "2017-06-11T06:11:38+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"splitbrain\\PHPArchive\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Andreas Gohr",
|
||||
"email": "andi@splitbrain.org"
|
||||
}
|
||||
],
|
||||
"description": "Pure-PHP implementation to read and write TAR and ZIP archives",
|
||||
"keywords": [
|
||||
"archive",
|
||||
"extract",
|
||||
"tar",
|
||||
"unpack",
|
||||
"unzip",
|
||||
"zip"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "phpseclib/phpseclib",
|
||||
"version": "2.0.6",
|
||||
"version_normalized": "2.0.6.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpseclib/phpseclib.git",
|
||||
"reference": "34a7699e6f31b1ef4035ee36444407cecf9f56aa"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34a7699e6f31b1ef4035ee36444407cecf9f56aa",
|
||||
"reference": "34a7699e6f31b1ef4035ee36444407cecf9f56aa",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phing/phing": "~2.7",
|
||||
"phpunit/phpunit": "~4.0",
|
||||
"sami/sami": "~2.0",
|
||||
"squizlabs/php_codesniffer": "~2.0"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
|
||||
"ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
|
||||
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
|
||||
"ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
|
||||
},
|
||||
"time": "2017-06-05T06:31:10+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"phpseclib/bootstrap.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"phpseclib\\": "phpseclib/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jim Wigginton",
|
||||
"email": "terrafrost@php.net",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "Patrick Monnerat",
|
||||
"email": "pm@datasphere.ch",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Andreas Fischer",
|
||||
"email": "bantu@phpbb.com",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Hans-Jürgen Petrich",
|
||||
"email": "petrich@tronic-media.com",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Graham Campbell",
|
||||
"email": "graham@alt-three.com",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
|
||||
"homepage": "http://phpseclib.sourceforge.net",
|
||||
"keywords": [
|
||||
"BigInteger",
|
||||
"aes",
|
||||
"asn.1",
|
||||
"asn1",
|
||||
"blowfish",
|
||||
"crypto",
|
||||
"cryptography",
|
||||
"encryption",
|
||||
"rsa",
|
||||
"security",
|
||||
"sftp",
|
||||
"signature",
|
||||
"signing",
|
||||
"ssh",
|
||||
"twofish",
|
||||
"x.509",
|
||||
"x509"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "simplepie/simplepie",
|
||||
"version": "1.5",
|
||||
"version_normalized": "1.5.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/simplepie/simplepie.git",
|
||||
"reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/simplepie/simplepie/zipball/5de5551953f95feef12cf355a7a26a70f94aa3ab",
|
||||
"reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4 || ~5"
|
||||
},
|
||||
"suggest": {
|
||||
"mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
|
||||
},
|
||||
"time": "2017-04-17T07:29:31+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"SimplePie": "library"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Ryan Parman",
|
||||
"homepage": "http://ryanparman.com/",
|
||||
"role": "Creator, alumnus developer"
|
||||
},
|
||||
{
|
||||
"name": "Geoffrey Sneddon",
|
||||
"homepage": "http://gsnedders.com/",
|
||||
"role": "Alumnus developer"
|
||||
},
|
||||
{
|
||||
"name": "Ryan McCue",
|
||||
"email": "me@ryanmccue.info",
|
||||
"homepage": "http://ryanmccue.info/",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "A simple Atom/RSS parsing library for PHP",
|
||||
"homepage": "http://simplepie.org/",
|
||||
"keywords": [
|
||||
"atom",
|
||||
"feeds",
|
||||
"rss"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
|
@ -6,17 +6,37 @@ MIT-licensed pure-PHP implementations of an arbitrary-precision integer
|
|||
arithmetic library, fully PKCS#1 (v2.1) compliant RSA, DES, 3DES, RC4, Rijndael,
|
||||
AES, Blowfish, Twofish, SSH-1, SSH-2, SFTP, and X.509
|
||||
|
||||
* [Download (1.0.4)](http://sourceforge.net/projects/phpseclib/files/phpseclib1.0.4.zip/download)
|
||||
* [Browse Git](https://github.com/phpseclib/phpseclib)
|
||||
* [Code Coverage Report](http://phpseclib.bantux.org/code_coverage/2.0/latest/)
|
||||
|
||||
<img src="http://phpseclib.sourceforge.net/pear-icon.png" alt="PEAR Channel" width="16" height="16">
|
||||
PEAR Channel: [phpseclib.sourceforge.net](http://phpseclib.sourceforge.net/pear.htm)
|
||||
* [Code Coverage Report](https://coverage.phpseclib.org/2.0/latest/)
|
||||
|
||||
## Documentation
|
||||
|
||||
* [Documentation / Manual](http://phpseclib.sourceforge.net/)
|
||||
* [API Documentation](http://phpseclib.bantux.org/api/2.0/) (generated by Sami)
|
||||
* [API Documentation](https://api.phpseclib.org/2.0/) (generated by Sami)
|
||||
|
||||
## Branches
|
||||
|
||||
### master
|
||||
|
||||
* Development Branch
|
||||
* Unstable API
|
||||
* Do not use in production
|
||||
|
||||
### 2.0
|
||||
|
||||
* Modernized version of 1.0
|
||||
* Minimum PHP version: 5.3.3
|
||||
* PSR-4 autoloading with namespace rooted at `\phpseclib`
|
||||
* Install via Composer: `composer require phpseclib/phpseclib ~2.0`
|
||||
|
||||
### 1.0
|
||||
|
||||
* Long term support (LTS) release
|
||||
* PHP4 compatible
|
||||
* Composer compatible (PSR-0 autoloading)
|
||||
* Install using Composer: `composer require phpseclib/phpseclib ~1.0`
|
||||
* Install using PEAR: See [phpseclib PEAR Channel Documentation](http://phpseclib.sourceforge.net/pear.htm)
|
||||
* [Download 1.0.7 as ZIP](http://sourceforge.net/projects/phpseclib/files/phpseclib1.0.7.zip/download)
|
||||
|
||||
## Support
|
||||
|
||||
|
@ -26,40 +46,29 @@ Need Support?
|
|||
* [Create a Support Ticket on GitHub](https://github.com/phpseclib/phpseclib/issues/new)
|
||||
* [Browse the Support Forum](http://www.frostjedi.com/phpbb/viewforum.php?f=46) (no longer in use)
|
||||
|
||||
## Installing Development Dependencies
|
||||
|
||||
Dependencies are managed via Composer.
|
||||
|
||||
1. Download the [`composer.phar`](https://getcomposer.org/composer.phar) executable as per the
|
||||
[Composer Download Instructions](https://getcomposer.org/download/), e.g. by running
|
||||
|
||||
``` sh
|
||||
curl -sS https://getcomposer.org/installer | php
|
||||
```
|
||||
|
||||
2. Install Dependencies
|
||||
|
||||
``` sh
|
||||
php composer.phar install
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
1. Fork the Project
|
||||
|
||||
2. Install Development Dependencies
|
||||
2. Ensure you have Composer installed (see [Composer Download Instructions](https://getcomposer.org/download/))
|
||||
|
||||
3. Create a Feature Branch
|
||||
3. Install Development Dependencies
|
||||
|
||||
4. (Recommended) Run the Test Suite
|
||||
``` sh
|
||||
composer install
|
||||
```
|
||||
|
||||
4. Create a Feature Branch
|
||||
|
||||
5. (Recommended) Run the Test Suite
|
||||
|
||||
``` sh
|
||||
vendor/bin/phpunit
|
||||
```
|
||||
5. (Recommended) Check whether your code conforms to our Coding Standards by running
|
||||
6. (Recommended) Check whether your code conforms to our Coding Standards by running
|
||||
|
||||
``` sh
|
||||
vendor/bin/phing -f build/build.xml sniff
|
||||
```
|
||||
|
||||
6. Send us a Pull Request
|
||||
7. Send us a Pull Request
|
||||
|
|
|
@ -317,7 +317,10 @@ class Blowfish extends Base
|
|||
function isValidEngine($engine)
|
||||
{
|
||||
if ($engine == self::ENGINE_OPENSSL) {
|
||||
if ($this->key_length != 16) {
|
||||
if (version_compare(PHP_VERSION, '5.3.7') < 0 && $this->key_length != 16) {
|
||||
return false;
|
||||
}
|
||||
if ($this->key_length < 16) {
|
||||
return false;
|
||||
}
|
||||
$this->cipher_name_openssl_ecb = 'bf-ecb';
|
||||
|
|
|
@ -144,8 +144,10 @@ class RC4 extends Base
|
|||
*/
|
||||
function isValidEngine($engine)
|
||||
{
|
||||
switch ($engine) {
|
||||
case Base::ENGINE_OPENSSL:
|
||||
if ($engine == Base::ENGINE_OPENSSL) {
|
||||
if (version_compare(PHP_VERSION, '5.3.7') >= 0) {
|
||||
$this->cipher_name_openssl = 'rc4-40';
|
||||
} else {
|
||||
switch (strlen($this->key)) {
|
||||
case 5:
|
||||
$this->cipher_name_openssl = 'rc4-40';
|
||||
|
@ -159,6 +161,7 @@ class RC4 extends Base
|
|||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return parent::isValidEngine($engine);
|
||||
|
|
|
@ -1572,6 +1572,15 @@ class RSA
|
|||
}
|
||||
|
||||
if ($components === false) {
|
||||
$this->comment = null;
|
||||
$this->modulus = null;
|
||||
$this->k = null;
|
||||
$this->exponent = null;
|
||||
$this->primes = null;
|
||||
$this->exponents = null;
|
||||
$this->coefficients = null;
|
||||
$this->publicExponent = null;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ class Random
|
|||
// method 1. prior to PHP 5.3 this would call rand() on windows hence the function_exists('class_alias') call.
|
||||
// ie. class_alias is a function that was introduced in PHP 5.3
|
||||
if (extension_loaded('mcrypt') && function_exists('class_alias')) {
|
||||
return mcrypt_create_iv($length);
|
||||
return @mcrypt_create_iv($length);
|
||||
}
|
||||
// method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was,
|
||||
// to quote <http://php.net/ChangeLog-5.php#5.3.4>, "possible blocking behavior". as of 5.3.4
|
||||
|
@ -101,7 +101,7 @@ class Random
|
|||
// not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir
|
||||
// restrictions or some such
|
||||
if (extension_loaded('mcrypt')) {
|
||||
return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
|
||||
return @mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
|
||||
}
|
||||
}
|
||||
// at this point we have no choice but to use a pure-PHP CSPRNG
|
||||
|
|
|
@ -1138,7 +1138,7 @@ class ASN1
|
|||
http://www.obj-sys.com/asn1tutorial/node14.html */
|
||||
|
||||
$pattern = $tag == self::TYPE_UTC_TIME ?
|
||||
'#(..)(..)(..)(..)(..)(..)(.*)#' :
|
||||
'#^(..)(..)(..)(..)(..)(..)?(.*)$#' :
|
||||
'#(....)(..)(..)(..)(..)(..).*([Z+-].*)$#';
|
||||
|
||||
preg_match($pattern, $content, $matches);
|
||||
|
@ -1163,7 +1163,7 @@ class ASN1
|
|||
$timezone = 0;
|
||||
}
|
||||
|
||||
return @$mktime($hour, $minute, $second, $month, $day, $year) + $timezone;
|
||||
return @$mktime((int)$hour, (int)$minute, (int)$second, (int)$month, (int)$day, (int)$year) + $timezone;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1907,6 +1907,9 @@ class X509
|
|||
// "SET Secure Electronic Transaction Specification"
|
||||
// http://www.maithean.com/docs/set_bk3.pdf
|
||||
case '2.23.42.7.0': // id-set-hashedRootKey
|
||||
// "Certificate Transparency"
|
||||
// https://tools.ietf.org/html/rfc6962
|
||||
case '1.3.6.1.4.1.11129.2.4.2':
|
||||
return true;
|
||||
|
||||
// CSR attributes
|
||||
|
@ -3463,8 +3466,8 @@ class X509
|
|||
|
||||
$altName = array();
|
||||
|
||||
if (isset($subject->domains) && count($subject->domains) > 1) {
|
||||
$altName = array_map(array('X509', '_dnsName'), $subject->domains);
|
||||
if (isset($subject->domains) && count($subject->domains)) {
|
||||
$altName = array_map(array('\phpseclib\File\X509', '_dnsName'), $subject->domains);
|
||||
}
|
||||
|
||||
if (isset($subject->ipAddresses) && count($subject->ipAddresses)) {
|
||||
|
|
|
@ -99,7 +99,7 @@ class SCP
|
|||
*
|
||||
* Connects to an SSH server
|
||||
*
|
||||
* @param \phpseclib\Net\SSH1|\phpseclin\Net\SSH2 $ssh
|
||||
* @param \phpseclib\Net\SSH1|\phpseclib\Net\SSH2 $ssh
|
||||
* @return \phpseclib\Net\SCP
|
||||
* @access public
|
||||
*/
|
||||
|
@ -299,6 +299,9 @@ class SCP
|
|||
$response = $this->ssh->_get_binary_packet();
|
||||
switch ($response[SSH1::RESPONSE_TYPE]) {
|
||||
case NET_SSH1_SMSG_STDOUT_DATA:
|
||||
if (strlen($response[SSH1::RESPONSE_DATA]) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $response[SSH1::RESPONSE_DATA]));
|
||||
return $this->ssh->_string_shift($response[SSH1::RESPONSE_DATA], $length);
|
||||
case NET_SSH1_SMSG_STDERR_DATA:
|
||||
|
|
|
@ -372,7 +372,7 @@ class SFTP extends SSH2
|
|||
);
|
||||
|
||||
if (!defined('NET_SFTP_QUEUE_SIZE')) {
|
||||
define('NET_SFTP_QUEUE_SIZE', 50);
|
||||
define('NET_SFTP_QUEUE_SIZE', 32);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -472,11 +472,20 @@ class SFTP extends SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nversion', $this->_string_shift($response, 4)));
|
||||
$this->version = $version;
|
||||
while (!empty($response)) {
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$key = $this->_string_shift($response, $length);
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$value = $this->_string_shift($response, $length);
|
||||
$this->extensions[$key] = $value;
|
||||
|
@ -587,12 +596,15 @@ class SFTP extends SSH2
|
|||
function _logError($response, $status = -1)
|
||||
{
|
||||
if ($status == -1) {
|
||||
if (strlen($response) < 4) {
|
||||
return;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
}
|
||||
|
||||
$error = $this->status_codes[$status];
|
||||
|
||||
if ($this->version > 2) {
|
||||
if ($this->version > 2 || strlen($response) < 4) {
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$this->sftp_errors[] = $error . ': ' . $this->_string_shift($response, $length);
|
||||
} else {
|
||||
|
@ -641,6 +653,9 @@ class SFTP extends SSH2
|
|||
// should work on all SFTP versions since the only part of the SSH_FXP_NAME packet the following looks
|
||||
// at is the first part and that part is defined the same in SFTP versions 3 through 6.
|
||||
$this->_string_shift($response, 4); // skip over the count - it should be 1, anyway
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
return $this->_string_shift($response, $length);
|
||||
case NET_SFTP_STATUS:
|
||||
|
@ -875,10 +890,19 @@ class SFTP extends SSH2
|
|||
$response = $this->_get_sftp_packet();
|
||||
switch ($this->packet_type) {
|
||||
case NET_SFTP_NAME:
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ncount', $this->_string_shift($response, 4)));
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$shortname = $this->_string_shift($response, $length);
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$longname = $this->_string_shift($response, $length);
|
||||
$attributes = $this->_parseAttributes($response);
|
||||
|
@ -905,6 +929,9 @@ class SFTP extends SSH2
|
|||
}
|
||||
break;
|
||||
case NET_SFTP_STATUS:
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_EOF) {
|
||||
$this->_logError($response, $status);
|
||||
|
@ -1499,6 +1526,9 @@ class SFTP extends SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
$this->_logError($response, $status);
|
||||
|
@ -1611,12 +1641,18 @@ class SFTP extends SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ncount', $this->_string_shift($response, 4)));
|
||||
// the file isn't a symlink
|
||||
if (!$count) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
return $this->_string_shift($response, $length);
|
||||
}
|
||||
|
@ -1651,6 +1687,9 @@ class SFTP extends SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
$this->_logError($response, $status);
|
||||
|
@ -1714,6 +1753,9 @@ class SFTP extends SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
$this->_logError($response, $status);
|
||||
|
@ -1751,6 +1793,9 @@ class SFTP extends SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
// presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED?
|
||||
|
@ -1871,7 +1916,14 @@ class SFTP extends SSH2
|
|||
break;
|
||||
case is_resource($data):
|
||||
$mode = $mode & ~self::SOURCE_LOCAL_FILE;
|
||||
$fp = $data;
|
||||
$info = stream_get_meta_data($data);
|
||||
if ($info['wrapper_type'] == 'PHP' && $info['stream_type'] == 'Input') {
|
||||
$fp = fopen('php://memory', 'w+');
|
||||
stream_copy_to_stream($data, $fp);
|
||||
rewind($fp);
|
||||
} else {
|
||||
$fp = $data;
|
||||
}
|
||||
break;
|
||||
case $mode & self::SOURCE_LOCAL_FILE:
|
||||
if (!is_file($data)) {
|
||||
|
@ -1976,6 +2028,9 @@ class SFTP extends SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
$this->_logError($response, $status);
|
||||
|
@ -2007,6 +2062,9 @@ class SFTP extends SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
$this->_logError($response, $status);
|
||||
|
@ -2180,6 +2238,15 @@ class SFTP extends SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (is_object($path)) {
|
||||
// It's an object. Cast it as string before we check anything else.
|
||||
$path = (string) $path;
|
||||
}
|
||||
|
||||
if (!is_string($path) || $path == '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$path = $this->_realpath($path);
|
||||
if ($path === false) {
|
||||
return false;
|
||||
|
@ -2197,6 +2264,9 @@ class SFTP extends SSH2
|
|||
}
|
||||
|
||||
// if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
$this->_logError($response, $status);
|
||||
|
@ -2622,6 +2692,9 @@ class SFTP extends SSH2
|
|||
}
|
||||
|
||||
// if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
$this->_logError($response, $status);
|
||||
|
@ -2649,6 +2722,10 @@ class SFTP extends SSH2
|
|||
function _parseAttributes(&$response)
|
||||
{
|
||||
$attr = array();
|
||||
if (strlen($response) < 4) {
|
||||
user_error('Malformed file attributes');
|
||||
return array();
|
||||
}
|
||||
extract(unpack('Nflags', $this->_string_shift($response, 4)));
|
||||
// SFTPv4+ have a type field (a byte) that follows the above flag field
|
||||
foreach ($this->attributes as $key => $value) {
|
||||
|
@ -2663,9 +2740,17 @@ class SFTP extends SSH2
|
|||
$attr['size'] = hexdec(bin2hex($this->_string_shift($response, 8)));
|
||||
break;
|
||||
case NET_SFTP_ATTR_UIDGID: // 0x00000002 (SFTPv3 only)
|
||||
if (strlen($response) < 8) {
|
||||
user_error('Malformed file attributes');
|
||||
return $attr;
|
||||
}
|
||||
$attr+= unpack('Nuid/Ngid', $this->_string_shift($response, 8));
|
||||
break;
|
||||
case NET_SFTP_ATTR_PERMISSIONS: // 0x00000004
|
||||
if (strlen($response) < 4) {
|
||||
user_error('Malformed file attributes');
|
||||
return $attr;
|
||||
}
|
||||
$attr+= unpack('Npermissions', $this->_string_shift($response, 4));
|
||||
// mode == permissions; permissions was the original array key and is retained for bc purposes.
|
||||
// mode was added because that's the more industry standard terminology
|
||||
|
@ -2676,13 +2761,29 @@ class SFTP extends SSH2
|
|||
}
|
||||
break;
|
||||
case NET_SFTP_ATTR_ACCESSTIME: // 0x00000008
|
||||
if (strlen($response) < 8) {
|
||||
user_error('Malformed file attributes');
|
||||
return $attr;
|
||||
}
|
||||
$attr+= unpack('Natime/Nmtime', $this->_string_shift($response, 8));
|
||||
break;
|
||||
case NET_SFTP_ATTR_EXTENDED: // 0x80000000
|
||||
if (strlen($response) < 4) {
|
||||
user_error('Malformed file attributes');
|
||||
return $attr;
|
||||
}
|
||||
extract(unpack('Ncount', $this->_string_shift($response, 4)));
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
if (strlen($response) < 4) {
|
||||
user_error('Malformed file attributes');
|
||||
return $attr;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$key = $this->_string_shift($response, $length);
|
||||
if (strlen($response) < 4) {
|
||||
user_error('Malformed file attributes');
|
||||
return $attr;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$attr[$key] = $this->_string_shift($response, $length);
|
||||
}
|
||||
|
@ -2792,13 +2893,13 @@ class SFTP extends SSH2
|
|||
if (defined('NET_SFTP_LOGGING')) {
|
||||
$packet_type = '-> ' . $this->packet_types[$type] .
|
||||
' (' . round($stop - $start, 4) . 's)';
|
||||
if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) {
|
||||
if (NET_SFTP_LOGGING == self::LOG_REALTIME) {
|
||||
echo "<pre>\r\n" . $this->_format_log(array($data), array($packet_type)) . "\r\n</pre>\r\n";
|
||||
flush();
|
||||
ob_flush();
|
||||
} else {
|
||||
$this->packet_type_log[] = $packet_type;
|
||||
if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) {
|
||||
if (NET_SFTP_LOGGING == self::LOG_COMPLEX) {
|
||||
$this->packet_log[] = $data;
|
||||
}
|
||||
}
|
||||
|
@ -2836,6 +2937,9 @@ class SFTP extends SSH2
|
|||
}
|
||||
$this->packet_buffer.= $temp;
|
||||
}
|
||||
if (strlen($this->packet_buffer) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($this->packet_buffer, 4)));
|
||||
$tempLength = $length;
|
||||
$tempLength-= strlen($this->packet_buffer);
|
||||
|
@ -2868,13 +2972,13 @@ class SFTP extends SSH2
|
|||
if (defined('NET_SFTP_LOGGING')) {
|
||||
$packet_type = '<- ' . $this->packet_types[$this->packet_type] .
|
||||
' (' . round($stop - $start, 4) . 's)';
|
||||
if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) {
|
||||
if (NET_SFTP_LOGGING == self::LOG_REALTIME) {
|
||||
echo "<pre>\r\n" . $this->_format_log(array($packet), array($packet_type)) . "\r\n</pre>\r\n";
|
||||
flush();
|
||||
ob_flush();
|
||||
} else {
|
||||
$this->packet_type_log[] = $packet_type;
|
||||
if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) {
|
||||
if (NET_SFTP_LOGGING == self::LOG_COMPLEX) {
|
||||
$this->packet_log[] = $packet;
|
||||
}
|
||||
}
|
||||
|
@ -2898,10 +3002,10 @@ class SFTP extends SSH2
|
|||
}
|
||||
|
||||
switch (NET_SFTP_LOGGING) {
|
||||
case NET_SFTP_LOG_COMPLEX:
|
||||
case self::LOG_COMPLEX:
|
||||
return $this->_format_log($this->packet_log, $this->packet_type_log);
|
||||
break;
|
||||
//case NET_SFTP_LOG_SIMPLE:
|
||||
//case self::LOG_SIMPLE:
|
||||
default:
|
||||
return $this->packet_type_log;
|
||||
}
|
||||
|
|
|
@ -575,28 +575,46 @@ class SSH1
|
|||
|
||||
$this->_string_shift($response[self::RESPONSE_DATA], 4);
|
||||
|
||||
if (strlen($response[self::RESPONSE_DATA]) < 2) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('nlen', $this->_string_shift($response[self::RESPONSE_DATA], 2));
|
||||
$server_key_public_exponent = new BigInteger($this->_string_shift($response[self::RESPONSE_DATA], ceil($temp['len'] / 8)), 256);
|
||||
$this->server_key_public_exponent = $server_key_public_exponent;
|
||||
|
||||
if (strlen($response[self::RESPONSE_DATA]) < 2) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('nlen', $this->_string_shift($response[self::RESPONSE_DATA], 2));
|
||||
$server_key_public_modulus = new BigInteger($this->_string_shift($response[self::RESPONSE_DATA], ceil($temp['len'] / 8)), 256);
|
||||
|
||||
$this->server_key_public_modulus = $server_key_public_modulus;
|
||||
|
||||
$this->_string_shift($response[self::RESPONSE_DATA], 4);
|
||||
|
||||
if (strlen($response[self::RESPONSE_DATA]) < 2) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('nlen', $this->_string_shift($response[self::RESPONSE_DATA], 2));
|
||||
$host_key_public_exponent = new BigInteger($this->_string_shift($response[self::RESPONSE_DATA], ceil($temp['len'] / 8)), 256);
|
||||
$this->host_key_public_exponent = $host_key_public_exponent;
|
||||
|
||||
if (strlen($response[self::RESPONSE_DATA]) < 2) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('nlen', $this->_string_shift($response[self::RESPONSE_DATA], 2));
|
||||
$host_key_public_modulus = new BigInteger($this->_string_shift($response[self::RESPONSE_DATA], ceil($temp['len'] / 8)), 256);
|
||||
|
||||
$this->host_key_public_modulus = $host_key_public_modulus;
|
||||
|
||||
$this->_string_shift($response[self::RESPONSE_DATA], 4);
|
||||
|
||||
// get a list of the supported ciphers
|
||||
if (strlen($response[self::RESPONSE_DATA]) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nsupported_ciphers_mask', $this->_string_shift($response[self::RESPONSE_DATA], 4)));
|
||||
|
||||
foreach ($this->supported_ciphers as $mask => $name) {
|
||||
if (($supported_ciphers_mask & (1 << $mask)) == 0) {
|
||||
unset($this->supported_ciphers[$mask]);
|
||||
|
@ -604,6 +622,9 @@ class SSH1
|
|||
}
|
||||
|
||||
// get a list of the supported authentications
|
||||
if (strlen($response[self::RESPONSE_DATA]) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nsupported_authentications_mask', $this->_string_shift($response[self::RESPONSE_DATA], 4)));
|
||||
foreach ($this->supported_authentications as $mask => $name) {
|
||||
if (($supported_authentications_mask & (1 << $mask)) == 0) {
|
||||
|
@ -1091,7 +1112,11 @@ class SSH1
|
|||
}
|
||||
|
||||
$start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
|
||||
$temp = unpack('Nlength', fread($this->fsock, 4));
|
||||
$data = fread($this->fsock, 4);
|
||||
if (strlen($data) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $data);
|
||||
|
||||
$padding_length = 8 - ($temp['length'] & 7);
|
||||
$length = $temp['length'] + $padding_length;
|
||||
|
@ -1112,6 +1137,9 @@ class SSH1
|
|||
$type = $raw[$padding_length];
|
||||
$data = substr($raw, $padding_length + 1, -4);
|
||||
|
||||
if (strlen($raw) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Ncrc', substr($raw, -4));
|
||||
|
||||
//if ( $temp['crc'] != $this->_crc($padding . $type . $data) ) {
|
||||
|
|
|
@ -1005,7 +1005,10 @@ class SSH2
|
|||
|
||||
if (!is_resource($this->fsock)) {
|
||||
$start = microtime(true);
|
||||
$this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout);
|
||||
// with stream_select a timeout of 0 means that no timeout takes place;
|
||||
// with fsockopen a timeout of 0 means that you instantly timeout
|
||||
// to resolve this incompatibility a timeout of 100,000 will be used for fsockopen if timeout is 0
|
||||
$this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout == 0 ? 100000 : $this->curTimeout);
|
||||
if (!$this->fsock) {
|
||||
$host = $this->host . ':' . $this->port;
|
||||
user_error(rtrim("Cannot connect to $host. Error $errno. $errstr"));
|
||||
|
@ -1021,6 +1024,10 @@ class SSH2
|
|||
}
|
||||
}
|
||||
|
||||
$this->identifier = $this->_generate_identifier();
|
||||
|
||||
fputs($this->fsock, $this->identifier . "\r\n");
|
||||
|
||||
/* According to the SSH2 specs,
|
||||
|
||||
"The server MAY send other lines of data before sending the version
|
||||
|
@ -1082,8 +1089,6 @@ class SSH2
|
|||
|
||||
$extra = $matches[1];
|
||||
|
||||
$this->identifier = $this->_generate_identifier();
|
||||
|
||||
if (defined('NET_SSH2_LOGGING')) {
|
||||
$this->_append_log('<-', $matches[0]);
|
||||
$this->_append_log('->', $this->identifier . "\r\n");
|
||||
|
@ -1099,15 +1104,13 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
fputs($this->fsock, $this->identifier . "\r\n");
|
||||
|
||||
$response = $this->_get_binary_packet();
|
||||
if ($response === false) {
|
||||
user_error('Connection closed by server');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ord($response[0]) != NET_SSH2_MSG_KEXINIT) {
|
||||
if (!strlen($response) || ord($response[0]) != NET_SSH2_MSG_KEXINIT) {
|
||||
user_error('Expected SSH_MSG_KEXINIT');
|
||||
return false;
|
||||
}
|
||||
|
@ -1304,36 +1307,69 @@ class SSH2
|
|||
$this->_string_shift($response, 1); // skip past the message number (it should be SSH_MSG_KEXINIT)
|
||||
$server_cookie = $this->_string_shift($response, 16);
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->kex_algorithms = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->server_host_key_algorithms = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->encryption_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->encryption_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->mac_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->mac_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->compression_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->compression_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->languages_client_to_server = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->languages_server_to_client = explode(',', $this->_string_shift($response, $temp['length']));
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Cfirst_kex_packet_follows', $this->_string_shift($response, 1)));
|
||||
$first_kex_packet_follows = $first_kex_packet_follows != 0;
|
||||
|
||||
|
@ -1432,10 +1468,16 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('NprimeLength', $this->_string_shift($response, 4)));
|
||||
$primeBytes = $this->_string_shift($response, $primeLength);
|
||||
$prime = new BigInteger($primeBytes, -256);
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('NgLength', $this->_string_shift($response, 4)));
|
||||
$gBytes = $this->_string_shift($response, $gLength);
|
||||
$g = new BigInteger($gBytes, -256);
|
||||
|
@ -1518,6 +1560,9 @@ class SSH2
|
|||
user_error('Connection closed by server');
|
||||
return false;
|
||||
}
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||
|
||||
if ($type != $serverKexReplyMessage) {
|
||||
|
@ -1525,18 +1570,33 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->server_public_host_key = $server_public_host_key = $this->_string_shift($response, $temp['length']);
|
||||
|
||||
if (strlen($server_public_host_key) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
|
||||
$public_key_format = $this->_string_shift($server_public_host_key, $temp['length']);
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$fBytes = $this->_string_shift($response, $temp['length']);
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($response, 4));
|
||||
$this->signature = $this->_string_shift($response, $temp['length']);
|
||||
|
||||
if (strlen($this->signature) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($this->signature, 4));
|
||||
$this->signature_format = $this->_string_shift($this->signature, $temp['length']);
|
||||
|
||||
|
@ -1607,6 +1667,9 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||
|
||||
if ($type != NET_SSH2_MSG_NEWKEYS) {
|
||||
|
@ -1937,6 +2000,9 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||
|
||||
if ($type != NET_SSH2_MSG_SERVICE_ACCEPT) {
|
||||
|
@ -1986,6 +2052,9 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||
|
||||
switch ($type) {
|
||||
|
@ -2041,6 +2110,9 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||
|
||||
switch ($type) {
|
||||
|
@ -2048,14 +2120,23 @@ class SSH2
|
|||
if (defined('NET_SSH2_LOGGING')) {
|
||||
$this->message_number_log[count($this->message_number_log) - 1] = 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ';
|
||||
}
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . utf8_decode($this->_string_shift($response, $length));
|
||||
return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER);
|
||||
case NET_SSH2_MSG_USERAUTH_FAILURE:
|
||||
// can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
|
||||
// multi-factor authentication
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$auth_methods = explode(',', $this->_string_shift($response, $length));
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Cpartial_success', $this->_string_shift($response, 1)));
|
||||
$partial_success = $partial_success != 0;
|
||||
|
||||
|
@ -2130,16 +2211,31 @@ class SSH2
|
|||
}
|
||||
}
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||
|
||||
switch ($type) {
|
||||
case NET_SSH2_MSG_USERAUTH_INFO_REQUEST:
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$this->_string_shift($response, $length); // name; may be empty
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$this->_string_shift($response, $length); // instruction; may be empty
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$this->_string_shift($response, $length); // language tag; may be empty
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nnum_prompts', $this->_string_shift($response, 4)));
|
||||
|
||||
for ($i = 0; $i < count($responses); $i++) {
|
||||
|
@ -2154,6 +2250,9 @@ class SSH2
|
|||
|
||||
if (isset($this->keyboard_requests_responses)) {
|
||||
for ($i = 0; $i < $num_prompts; $i++) {
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
// prompt - ie. "Password: "; must not be empty
|
||||
$prompt = $this->_string_shift($response, $length);
|
||||
|
@ -2299,10 +2398,16 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||
|
||||
switch ($type) {
|
||||
case NET_SSH2_MSG_USERAUTH_FAILURE:
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$this->errors[] = 'SSH_MSG_USERAUTH_FAILURE: ' . $this->_string_shift($response, $length);
|
||||
return false;
|
||||
|
@ -2334,6 +2439,9 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||
|
||||
switch ($type) {
|
||||
|
@ -2389,7 +2497,12 @@ class SSH2
|
|||
$this->is_timeout = false;
|
||||
$this->stdErrorLog = '';
|
||||
|
||||
if (!($this->bitmap & self::MASK_LOGIN)) {
|
||||
if (!$this->isAuthenticated()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->in_request_pty_exec) {
|
||||
user_error('If you want to run multiple exec()\'s you will need to disable (and re-enable if appropriate) a PTY for each one.');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -2452,6 +2565,9 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
list(, $type) = unpack('C', $this->_string_shift($response, 1));
|
||||
|
||||
switch ($type) {
|
||||
|
@ -2588,6 +2704,9 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
list(, $type) = unpack('C', $this->_string_shift($response, 1));
|
||||
|
||||
switch ($type) {
|
||||
|
@ -2681,7 +2800,7 @@ class SSH2
|
|||
$this->curTimeout = $this->timeout;
|
||||
$this->is_timeout = false;
|
||||
|
||||
if (!($this->bitmap & self::MASK_LOGIN)) {
|
||||
if (!$this->isAuthenticated()) {
|
||||
user_error('Operation disallowed prior to login()');
|
||||
return false;
|
||||
}
|
||||
|
@ -2723,7 +2842,7 @@ class SSH2
|
|||
*/
|
||||
function write($cmd)
|
||||
{
|
||||
if (!($this->bitmap & self::MASK_LOGIN)) {
|
||||
if (!$this->isAuthenticated()) {
|
||||
user_error('Operation disallowed prior to login()');
|
||||
return false;
|
||||
}
|
||||
|
@ -2923,6 +3042,9 @@ class SSH2
|
|||
return false;
|
||||
}
|
||||
|
||||
if (strlen($raw) < 5) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Npacket_length/Cpadding_length', $this->_string_shift($raw, 5)));
|
||||
|
||||
$remaining_length = $packet_length + 4 - $this->decrypt_block_size;
|
||||
|
@ -2998,6 +3120,9 @@ class SSH2
|
|||
switch (ord($payload[0])) {
|
||||
case NET_SSH2_MSG_DISCONNECT:
|
||||
$this->_string_shift($payload, 1);
|
||||
if (strlen($payload) < 8) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8)));
|
||||
$this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . utf8_decode($this->_string_shift($payload, $length));
|
||||
$this->bitmap = 0;
|
||||
|
@ -3007,6 +3132,9 @@ class SSH2
|
|||
break;
|
||||
case NET_SSH2_MSG_DEBUG:
|
||||
$this->_string_shift($payload, 2);
|
||||
if (strlen($payload) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
||||
$this->errors[] = 'SSH_MSG_DEBUG: ' . utf8_decode($this->_string_shift($payload, $length));
|
||||
$payload = $this->_get_binary_packet();
|
||||
|
@ -3024,17 +3152,23 @@ class SSH2
|
|||
}
|
||||
|
||||
// see http://tools.ietf.org/html/rfc4252#section-5.4; only called when the encryption has been activated and when we haven't already logged in
|
||||
if (($this->bitmap & self::MASK_CONNECTED) && !($this->bitmap & self::MASK_LOGIN) && ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) {
|
||||
if (($this->bitmap & self::MASK_CONNECTED) && !$this->isAuthenticated() && ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) {
|
||||
$this->_string_shift($payload, 1);
|
||||
if (strlen($payload) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
||||
$this->banner_message = utf8_decode($this->_string_shift($payload, $length));
|
||||
$payload = $this->_get_binary_packet();
|
||||
}
|
||||
|
||||
// only called when we've already logged in
|
||||
if (($this->bitmap & self::MASK_CONNECTED) && ($this->bitmap & self::MASK_LOGIN)) {
|
||||
if (($this->bitmap & self::MASK_CONNECTED) && $this->isAuthenticated()) {
|
||||
switch (ord($payload[0])) {
|
||||
case NET_SSH2_MSG_GLOBAL_REQUEST: // see http://tools.ietf.org/html/rfc4254#section-4
|
||||
if (strlen($payload) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
||||
$this->errors[] = 'SSH_MSG_GLOBAL_REQUEST: ' . $this->_string_shift($payload, $length);
|
||||
|
||||
|
@ -3046,8 +3180,14 @@ class SSH2
|
|||
break;
|
||||
case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1
|
||||
$this->_string_shift($payload, 1);
|
||||
if (strlen($payload) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
||||
$data = $this->_string_shift($payload, $length);
|
||||
if (strlen($payload) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nserver_channel', $this->_string_shift($payload, 4)));
|
||||
switch ($data) {
|
||||
case 'auth-agent':
|
||||
|
@ -3055,6 +3195,9 @@ class SSH2
|
|||
if (isset($this->agent)) {
|
||||
$new_channel = self::CHANNEL_AGENT_FORWARD;
|
||||
|
||||
if (strlen($payload) < 8) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nremote_window_size', $this->_string_shift($payload, 4)));
|
||||
extract(unpack('Nremote_maximum_packet_size', $this->_string_shift($payload, 4)));
|
||||
|
||||
|
@ -3100,6 +3243,9 @@ class SSH2
|
|||
break;
|
||||
case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST:
|
||||
$this->_string_shift($payload, 1);
|
||||
if (strlen($payload) < 8) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nchannel', $this->_string_shift($payload, 4)));
|
||||
extract(unpack('Nwindow_size', $this->_string_shift($payload, 4)));
|
||||
$this->window_size_client_to_server[$channel]+= $window_size;
|
||||
|
@ -3165,6 +3311,10 @@ class SSH2
|
|||
*/
|
||||
function disablePTY()
|
||||
{
|
||||
if ($this->in_request_pty_exec) {
|
||||
$this->_close_channel(self::CHANNEL_EXEC);
|
||||
$this->in_request_pty_exec = false;
|
||||
}
|
||||
$this->request_pty = false;
|
||||
}
|
||||
|
||||
|
@ -3230,8 +3380,14 @@ class SSH2
|
|||
return '';
|
||||
}
|
||||
|
||||
if (!strlen($response)) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
if ($type == NET_SSH2_MSG_CHANNEL_OPEN) {
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
} else {
|
||||
|
@ -3255,14 +3411,23 @@ class SSH2
|
|||
case NET_SSH2_MSG_CHANNEL_OPEN:
|
||||
switch ($type) {
|
||||
case NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION:
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nserver_channel', $this->_string_shift($response, 4)));
|
||||
$this->server_channels[$channel] = $server_channel;
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nwindow_size', $this->_string_shift($response, 4)));
|
||||
if ($window_size < 0) {
|
||||
$window_size&= 0x7FFFFFFF;
|
||||
$window_size+= 0x80000000;
|
||||
}
|
||||
$this->window_size_client_to_server[$channel] = $window_size;
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Npacket_size_client_to_server', $this->_string_shift($response, 4));
|
||||
$this->packet_size_client_to_server[$channel] = $temp['packet_size_client_to_server'];
|
||||
$result = $client_channel == $channel ? true : $this->_get_channel_packet($client_channel, $skip_extended);
|
||||
|
@ -3302,6 +3467,9 @@ class SSH2
|
|||
$this->_send_channel_packet($channel, chr(0));
|
||||
}
|
||||
*/
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$data = $this->_string_shift($response, $length);
|
||||
|
||||
|
@ -3328,6 +3496,9 @@ class SSH2
|
|||
}
|
||||
*/
|
||||
// currently, there's only one possible value for $data_type_code: NET_SSH2_EXTENDED_DATA_STDERR
|
||||
if (strlen($response) < 8) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Ndata_type_code/Nlength', $this->_string_shift($response, 8)));
|
||||
$data = $this->_string_shift($response, $length);
|
||||
$this->stdErrorLog.= $data;
|
||||
|
@ -3343,14 +3514,23 @@ class SSH2
|
|||
$this->channel_buffers[$channel][] = $data;
|
||||
break;
|
||||
case NET_SSH2_MSG_CHANNEL_REQUEST:
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$value = $this->_string_shift($response, $length);
|
||||
switch ($value) {
|
||||
case 'exit-signal':
|
||||
$this->_string_shift($response, 1);
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
$this->errors[] = 'SSH_MSG_CHANNEL_REQUEST (exit-signal): ' . $this->_string_shift($response, $length);
|
||||
$this->_string_shift($response, 1);
|
||||
if (strlen($response) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||
if ($length) {
|
||||
$this->errors[count($this->errors)].= "\r\n" . $this->_string_shift($response, $length);
|
||||
|
@ -3363,6 +3543,9 @@ class SSH2
|
|||
|
||||
break;
|
||||
case 'exit-status':
|
||||
if (strlen($response) < 5) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Cfalse/Nexit_status', $this->_string_shift($response, 5)));
|
||||
$this->exit_status = $exit_status;
|
||||
|
||||
|
@ -3696,10 +3879,9 @@ class SSH2
|
|||
switch (NET_SSH2_LOGGING) {
|
||||
case self::LOG_SIMPLE:
|
||||
return $this->message_number_log;
|
||||
break;
|
||||
case self::LOG_COMPLEX:
|
||||
return $this->_format_log($this->message_log, $this->message_number_log);
|
||||
break;
|
||||
$log = $this->_format_log($this->message_log, $this->message_number_log);
|
||||
return PHP_SAPI == 'cli' ? $log : '<pre>' . $log . '</pre>';
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
@ -3991,6 +4173,9 @@ class SSH2
|
|||
$signature = $this->signature;
|
||||
$server_public_host_key = $this->server_public_host_key;
|
||||
|
||||
if (strlen($server_public_host_key) < 4) {
|
||||
return false;
|
||||
}
|
||||
extract(unpack('Nlength', $this->_string_shift($server_public_host_key, 4)));
|
||||
$this->_string_shift($server_public_host_key, $length);
|
||||
|
||||
|
@ -4006,15 +4191,27 @@ class SSH2
|
|||
case 'ssh-dss':
|
||||
$zero = new BigInteger();
|
||||
|
||||
if (strlen($server_public_host_key) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
|
||||
$p = new BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
|
||||
|
||||
if (strlen($server_public_host_key) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
|
||||
$q = new BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
|
||||
|
||||
if (strlen($server_public_host_key) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
|
||||
$g = new BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
|
||||
|
||||
if (strlen($server_public_host_key) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
|
||||
$y = new BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
|
||||
|
||||
|
@ -4061,15 +4258,24 @@ class SSH2
|
|||
|
||||
break;
|
||||
case 'ssh-rsa':
|
||||
if (strlen($server_public_host_key) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
|
||||
$e = new BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
|
||||
|
||||
if (strlen($server_public_host_key) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
|
||||
$rawN = $this->_string_shift($server_public_host_key, $temp['length']);
|
||||
$n = new BigInteger($rawN, -256);
|
||||
$nLength = strlen(ltrim($rawN, "\0"));
|
||||
|
||||
/*
|
||||
if (strlen($signature) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($signature, 4));
|
||||
$signature = $this->_string_shift($signature, $temp['length']);
|
||||
|
||||
|
@ -4082,6 +4288,9 @@ class SSH2
|
|||
}
|
||||
*/
|
||||
|
||||
if (strlen($signature) < 4) {
|
||||
return false;
|
||||
}
|
||||
$temp = unpack('Nlength', $this->_string_shift($signature, 4));
|
||||
$s = new BigInteger($this->_string_shift($signature, $temp['length']), 256);
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* A PHP-Based RSS and Atom Feed Framework.
|
||||
* Takes the hard work out of managing a complete RSS/Atom solution.
|
||||
*
|
||||
* Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
|
||||
* Copyright (c) 2004-2017, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
|
@ -33,8 +33,8 @@
|
|||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* @package SimplePie
|
||||
* @version 1.4.3
|
||||
* @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
|
||||
* @version 1.5
|
||||
* @copyright 2004-2017 Ryan Parman, Geoffrey Sneddon, Ryan McCue
|
||||
* @author Ryan Parman
|
||||
* @author Geoffrey Sneddon
|
||||
* @author Ryan McCue
|
||||
|
@ -50,7 +50,7 @@ define('SIMPLEPIE_NAME', 'SimplePie');
|
|||
/**
|
||||
* SimplePie Version
|
||||
*/
|
||||
define('SIMPLEPIE_VERSION', '1.4.3');
|
||||
define('SIMPLEPIE_VERSION', '1.5');
|
||||
|
||||
/**
|
||||
* SimplePie Build
|
||||
|
@ -643,6 +643,12 @@ class SimplePie
|
|||
*/
|
||||
public $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
|
||||
|
||||
/**
|
||||
* @var bool Should we throw exceptions, or use the old-style error property?
|
||||
* @access private
|
||||
*/
|
||||
public $enable_exceptions = false;
|
||||
|
||||
/**
|
||||
* The SimplePie class contains feed level data and options
|
||||
*
|
||||
|
|
|
@ -56,7 +56,7 @@ class SimplePie_Category
|
|||
/**
|
||||
* Category identifier
|
||||
*
|
||||
* @var string
|
||||
* @var string|null
|
||||
* @see get_term
|
||||
*/
|
||||
var $term;
|
||||
|
@ -64,7 +64,7 @@ class SimplePie_Category
|
|||
/**
|
||||
* Categorization scheme identifier
|
||||
*
|
||||
* @var string
|
||||
* @var string|null
|
||||
* @see get_scheme()
|
||||
*/
|
||||
var $scheme;
|
||||
|
@ -72,23 +72,36 @@ class SimplePie_Category
|
|||
/**
|
||||
* Human readable label
|
||||
*
|
||||
* @var string
|
||||
* @var string|null
|
||||
* @see get_label()
|
||||
*/
|
||||
var $label;
|
||||
|
||||
/**
|
||||
* Category type
|
||||
*
|
||||
* category for <category>
|
||||
* subject for <dc:subject>
|
||||
*
|
||||
* @var string|null
|
||||
* @see get_type()
|
||||
*/
|
||||
var $type;
|
||||
|
||||
/**
|
||||
* Constructor, used to input the data
|
||||
*
|
||||
* @param string $term
|
||||
* @param string $scheme
|
||||
* @param string $label
|
||||
* @param string|null $term
|
||||
* @param string|null $scheme
|
||||
* @param string|null $label
|
||||
* @param string|null $type
|
||||
*/
|
||||
public function __construct($term = null, $scheme = null, $label = null)
|
||||
public function __construct($term = null, $scheme = null, $label = null, $type = null)
|
||||
{
|
||||
$this->term = $term;
|
||||
$this->scheme = $scheme;
|
||||
$this->label = $label;
|
||||
$this->type = $type;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -109,14 +122,7 @@ class SimplePie_Category
|
|||
*/
|
||||
public function get_term()
|
||||
{
|
||||
if ($this->term !== null)
|
||||
{
|
||||
return $this->term;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return $this->term;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -126,31 +132,32 @@ class SimplePie_Category
|
|||
*/
|
||||
public function get_scheme()
|
||||
{
|
||||
if ($this->scheme !== null)
|
||||
{
|
||||
return $this->scheme;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return $this->scheme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the human readable label
|
||||
*
|
||||
* @param bool $strict
|
||||
* @return string|null
|
||||
*/
|
||||
public function get_label()
|
||||
public function get_label($strict = false)
|
||||
{
|
||||
if ($this->label !== null)
|
||||
{
|
||||
return $this->label;
|
||||
}
|
||||
else
|
||||
if ($this->label === null && $strict !== true)
|
||||
{
|
||||
return $this->get_term();
|
||||
}
|
||||
return $this->label;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the category type
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function get_type()
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -206,9 +206,10 @@ class SimplePie_Item
|
|||
*
|
||||
* @since Beta 2
|
||||
* @param boolean $hash Should we force using a hash instead of the supplied ID?
|
||||
* @return string
|
||||
* @param string|false $fn User-supplied function to generate an hash
|
||||
* @return string|null
|
||||
*/
|
||||
public function get_id($hash = false, $fn = '')
|
||||
public function get_id($hash = false, $fn = 'md5')
|
||||
{
|
||||
if (!$hash)
|
||||
{
|
||||
|
@ -237,7 +238,15 @@ class SimplePie_Item
|
|||
return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT);
|
||||
}
|
||||
}
|
||||
if ($fn === '' || !is_callable($fn)) $fn = 'md5';
|
||||
if ($fn === false)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
elseif (!is_callable($fn))
|
||||
{
|
||||
trigger_error('User-supplied function $fn must be callable', E_USER_WARNING);
|
||||
$fn = 'md5';
|
||||
}
|
||||
return call_user_func($fn,
|
||||
$this->get_permalink().$this->get_title().$this->get_content());
|
||||
}
|
||||
|
@ -460,7 +469,8 @@ class SimplePie_Item
|
|||
{
|
||||
$categories = array();
|
||||
|
||||
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
|
||||
$type = 'category';
|
||||
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, $type) as $category)
|
||||
{
|
||||
$term = null;
|
||||
$scheme = null;
|
||||
|
@ -477,9 +487,9 @@ class SimplePie_Item
|
|||
{
|
||||
$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_HTML);
|
||||
}
|
||||
$categories[] = $this->registry->create('Category', array($term, $scheme, $label));
|
||||
$categories[] = $this->registry->create('Category', array($term, $scheme, $label, $type));
|
||||
}
|
||||
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
|
||||
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, $type) as $category)
|
||||
{
|
||||
// This is really the label, but keep this as the term also for BC.
|
||||
// Label will also work on retrieving because that falls back to term.
|
||||
|
@ -492,15 +502,17 @@ class SimplePie_Item
|
|||
{
|
||||
$scheme = null;
|
||||
}
|
||||
$categories[] = $this->registry->create('Category', array($term, $scheme, null));
|
||||
$categories[] = $this->registry->create('Category', array($term, $scheme, null, $type));
|
||||
}
|
||||
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
|
||||
|
||||
$type = 'subject';
|
||||
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, $type) as $category)
|
||||
{
|
||||
$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
|
||||
$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null, $type));
|
||||
}
|
||||
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
|
||||
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, $type) as $category)
|
||||
{
|
||||
$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
|
||||
$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null, $type));
|
||||
}
|
||||
|
||||
if (!empty($categories))
|
||||
|
@ -2814,9 +2826,17 @@ class SimplePie_Item
|
|||
{
|
||||
$length = ceil($link['attribs']['']['length']);
|
||||
}
|
||||
if (isset($link['attribs']['']['title']))
|
||||
{
|
||||
$title = $this->sanitize($link['attribs']['']['title'], SIMPLEPIE_CONSTRUCT_TEXT);
|
||||
}
|
||||
else
|
||||
{
|
||||
$title = $title_parent;
|
||||
}
|
||||
|
||||
// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
|
||||
$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
|
||||
$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title, $width));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,4 +5,4 @@ vendor/
|
|||
composer.lock
|
||||
apigen.phar
|
||||
docs/
|
||||
|
||||
nbproject/
|
|
@ -356,7 +356,7 @@ class Tar extends Archive
|
|||
}
|
||||
|
||||
if ($this->comptype === Archive::COMPRESS_GZIP) {
|
||||
return gzcompress($this->memory, $this->complevel);
|
||||
return gzencode($this->memory, $this->complevel);
|
||||
}
|
||||
if ($this->comptype === Archive::COMPRESS_BZIP) {
|
||||
return bzcompress($this->memory);
|
||||
|
|
Loading…
Reference in New Issue