mirror of
https://github.com/danog/tgseclib.git
synced 2025-01-22 05:51:20 +01:00
commit
96dae90489
@ -1582,7 +1582,7 @@ class Crypt_RSA {
|
||||
* DER-decode the length
|
||||
*
|
||||
* DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
|
||||
* {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 § 8.1.3} for more information.
|
||||
* {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
|
||||
*
|
||||
* @access private
|
||||
* @param String $string
|
||||
@ -1603,7 +1603,7 @@ class Crypt_RSA {
|
||||
* DER-encode the length
|
||||
*
|
||||
* DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
|
||||
* {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 § 8.1.3} for more information.
|
||||
* {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
|
||||
*
|
||||
* @access private
|
||||
* @param Integer $length
|
||||
@ -1872,7 +1872,7 @@ class Crypt_RSA {
|
||||
*
|
||||
* Protects against a particular type of timing attack described.
|
||||
*
|
||||
* See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don’t use MessageDigest.isEquals)}
|
||||
* See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don't use MessageDigest.isEquals)}
|
||||
*
|
||||
* Thanks for the heads up singpolyma!
|
||||
*
|
||||
|
@ -143,7 +143,7 @@ function crypt_random_string($length) {
|
||||
serialize($_POST) .
|
||||
serialize($_GET) .
|
||||
serialize($_COOKIE) .
|
||||
serialize($_GLOBAL) .
|
||||
serialize($GLOBALS) .
|
||||
serialize($_SESSION) .
|
||||
serialize($_OLD_SESSION)
|
||||
));
|
||||
|
@ -298,12 +298,12 @@ class File_ANSI {
|
||||
}
|
||||
// http://ascii-table.com/ansi-escape-sequences-vt-100.php
|
||||
switch ($this->ansi) {
|
||||
case "\x1B[H":
|
||||
case "\x1B[H": // Move cursor to upper left corner
|
||||
$this->old_x = $this->x;
|
||||
$this->old_y = $this->y;
|
||||
$this->x = $this->y = 0;
|
||||
break;
|
||||
case "\x1B[J":
|
||||
case "\x1B[J": // Clear screen from cursor down
|
||||
$this->history = array_merge($this->history, array_slice(array_splice($this->screen, $this->y + 1), 0, $this->old_y));
|
||||
$this->screen = array_merge($this->screen, array_fill($this->y, $this->max_y, ''));
|
||||
|
||||
@ -314,32 +314,41 @@ class File_ANSI {
|
||||
array_shift($this->history);
|
||||
array_shift($this->history_attrs);
|
||||
}
|
||||
case "\x1B[K":
|
||||
case "\x1B[K": // Clear screen from cursor right
|
||||
$this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x);
|
||||
|
||||
array_splice($this->attrs[$this->y], $this->x + 1);
|
||||
break;
|
||||
case "\x1B[2K": // Clear entire line
|
||||
$this->screen[$this->y] = str_repeat(' ', $this->x);
|
||||
$this->attrs[$this->y] = $this->attr_row;
|
||||
break;
|
||||
case "\x1B[?1h": // set cursor key to application
|
||||
case "\x1B[?25h": // show the cursor
|
||||
break;
|
||||
case "\x1BE": // Move to next line
|
||||
$this->_newLine();
|
||||
$this->x = 0;
|
||||
break;
|
||||
default:
|
||||
switch (true) {
|
||||
case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match):
|
||||
case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match): // Move cursor to screen location v,h
|
||||
$this->old_x = $this->x;
|
||||
$this->old_y = $this->y;
|
||||
$this->x = $match[2] - 1;
|
||||
$this->y = $match[1] - 1;
|
||||
break;
|
||||
case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match):
|
||||
case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match): // Move cursor right n lines
|
||||
$this->old_x = $this->x;
|
||||
$x = $match[1] - 1;
|
||||
break;
|
||||
case preg_match('#\x1B\[(\d+);(\d+)r#', $this->ansi, $match): // Set top and bottom lines of a window
|
||||
break;
|
||||
case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match):
|
||||
case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match): // character attributes
|
||||
$mods = explode(';', $match[1]);
|
||||
foreach ($mods as $mod) {
|
||||
switch ($mod) {
|
||||
case 0:
|
||||
case 0: // Turn off character attributes
|
||||
$this->attrs[$this->y][$this->x] = '';
|
||||
|
||||
if ($this->bold) $this->attrs[$this->y][$this->x].= '</b>';
|
||||
@ -355,25 +364,25 @@ class File_ANSI {
|
||||
|
||||
$this->bold = $this->underline = $this->blink = $this->color = $this->reverse = false;
|
||||
break;
|
||||
case 1:
|
||||
case 1: // Turn bold mode on
|
||||
if (!$this->bold) {
|
||||
$this->attrs[$this->y][$this->x] = '<b>';
|
||||
$this->bold = true;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
case 4: // Turn underline mode on
|
||||
if (!$this->underline) {
|
||||
$this->attrs[$this->y][$this->x] = '<u>';
|
||||
$this->underline = true;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
case 5: // Turn blinking mode on
|
||||
if (!$this->blink) {
|
||||
$this->attrs[$this->y][$this->x] = '<blink>';
|
||||
$this->blink = true;
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
case 7: // Turn reverse video on
|
||||
$this->reverse = !$this->reverse;
|
||||
$temp = $this->background;
|
||||
$this->background = $this->foreground;
|
||||
@ -384,7 +393,7 @@ class File_ANSI {
|
||||
}
|
||||
$this->color = true;
|
||||
break;
|
||||
default:
|
||||
default: // set colors
|
||||
//$front = $this->reverse ? &$this->background : &$this->foreground;
|
||||
$front = &$this->{ $this->reverse ? 'background' : 'foreground' };
|
||||
//$back = $this->reverse ? &$this->foreground : &$this->background;
|
||||
@ -424,7 +433,7 @@ class File_ANSI {
|
||||
}
|
||||
break;
|
||||
default:
|
||||
echo "{$this->ansi} unsupported\r\n";
|
||||
user_error("{$this->ansi} unsupported\r\n");
|
||||
}
|
||||
}
|
||||
$this->ansi = '';
|
||||
@ -436,25 +445,7 @@ class File_ANSI {
|
||||
$this->x = 0;
|
||||
break;
|
||||
case "\n":
|
||||
//if ($this->y < $this->max_y) {
|
||||
// $this->y++;
|
||||
//}
|
||||
|
||||
while ($this->y >= $this->max_y) {
|
||||
$this->history = array_merge($this->history, array(array_shift($this->screen)));
|
||||
$this->screen[] = '';
|
||||
|
||||
$this->history_attrs = array_merge($this->history_attrs, array(array_shift($this->attrs)));
|
||||
$this->attrs[] = $this->attr_row;
|
||||
|
||||
if (count($this->history) >= $this->max_history) {
|
||||
array_shift($this->history);
|
||||
array_shift($this->history_attrs);
|
||||
}
|
||||
|
||||
$this->y--;
|
||||
}
|
||||
$this->y++;
|
||||
$this->_newLine();
|
||||
break;
|
||||
case "\x0F": // shift
|
||||
break;
|
||||
@ -479,6 +470,36 @@ class File_ANSI {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new line
|
||||
*
|
||||
* Also update the $this->screen and $this->history buffers
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
function _newLine()
|
||||
{
|
||||
//if ($this->y < $this->max_y) {
|
||||
// $this->y++;
|
||||
//}
|
||||
|
||||
while ($this->y >= $this->max_y) {
|
||||
$this->history = array_merge($this->history, array(array_shift($this->screen)));
|
||||
$this->screen[] = '';
|
||||
|
||||
$this->history_attrs = array_merge($this->history_attrs, array(array_shift($this->attrs)));
|
||||
$this->attrs[] = $this->attr_row;
|
||||
|
||||
if (count($this->history) >= $this->max_history) {
|
||||
array_shift($this->history);
|
||||
array_shift($this->history_attrs);
|
||||
}
|
||||
|
||||
$this->y--;
|
||||
}
|
||||
$this->y++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current screen without preformating
|
||||
*
|
||||
@ -537,4 +558,4 @@ class File_ANSI {
|
||||
|
||||
return '<pre style="color: white; background: black" width="' . ($this->max_x + 1) . '">' . $scrollback . '</pre>';
|
||||
}
|
||||
}
|
||||
}
|
@ -304,12 +304,12 @@ class File_ASN1 {
|
||||
} while ( $loop );
|
||||
}
|
||||
|
||||
// Length, as discussed in § 8.1.3 of X.690-0207.pdf#page=13
|
||||
// Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13
|
||||
$length = ord($this->_string_shift($encoded));
|
||||
$start++;
|
||||
if ( $length == 0x80 ) { // indefinite length
|
||||
// "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all
|
||||
// immediately available." -- § 8.1.3.2.c
|
||||
// immediately available." -- paragraph 8.1.3.2.c
|
||||
//if ( !$constructed ) {
|
||||
// return false;
|
||||
//}
|
||||
@ -323,7 +323,7 @@ class File_ASN1 {
|
||||
extract(unpack('Nlength', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)));
|
||||
}
|
||||
|
||||
// End-of-content, see §§ 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2
|
||||
// End-of-content, see paragraphs 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2
|
||||
if (!$type && !$length) {
|
||||
return $decoded;
|
||||
}
|
||||
@ -357,7 +357,7 @@ class File_ASN1 {
|
||||
// decode UNIVERSAL tags
|
||||
switch ($tag) {
|
||||
case FILE_ASN1_TYPE_BOOLEAN:
|
||||
// "The contents octets shall consist of a single octet." -- § 8.2.1
|
||||
// "The contents octets shall consist of a single octet." -- paragraph 8.2.1
|
||||
//if (strlen($content) != 1) {
|
||||
// return false;
|
||||
//}
|
||||
@ -410,7 +410,7 @@ class File_ASN1 {
|
||||
}
|
||||
break;
|
||||
case FILE_ASN1_TYPE_NULL:
|
||||
// "The contents octets shall not contain any octets." -- § 8.8.2
|
||||
// "The contents octets shall not contain any octets." -- paragraph 8.8.2
|
||||
//if (strlen($content)) {
|
||||
// return false;
|
||||
//}
|
||||
@ -441,7 +441,7 @@ class File_ASN1 {
|
||||
/* Each character string type shall be encoded as if it had been declared:
|
||||
[UNIVERSAL x] IMPLICIT OCTET STRING
|
||||
|
||||
-- X.690-0207.pdf#page=23 (§ 8.21.3)
|
||||
-- X.690-0207.pdf#page=23 (paragraph 8.21.3)
|
||||
|
||||
Per that, we're not going to do any validation. If there are any illegal characters in the string,
|
||||
we don't really care */
|
||||
@ -1055,7 +1055,7 @@ class File_ASN1 {
|
||||
* DER-encode the length
|
||||
*
|
||||
* DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
|
||||
* {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 § 8.1.3} for more information.
|
||||
* {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
|
||||
*
|
||||
* @access private
|
||||
* @param Integer $length
|
||||
|
@ -2630,9 +2630,9 @@ class File_X509 {
|
||||
case !isset($this->currentCert) || !is_array($this->currentCert):
|
||||
break;
|
||||
case isset($this->currentCert['tbsCertificate']):
|
||||
return $this->getDNProp($propname, $this->currentCert['tbsCertificate']['issuer'], $withType);
|
||||
return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['issuer'], $withType);
|
||||
case isset($this->currentCert['tbsCertList']):
|
||||
return $this->getDNProp($propname, $this->currentCert['tbsCertList']['issuer'], $withType);
|
||||
return $this->getDNProp($propName, $this->currentCert['tbsCertList']['issuer'], $withType);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -2656,7 +2656,7 @@ class File_X509 {
|
||||
case isset($this->currentCert['tbsCertificate']):
|
||||
return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['subject'], $withType);
|
||||
case isset($this->currentCert['certificationRequestInfo']):
|
||||
return $this->getDNProp($propname, $this->currentCert['certificationRequestInfo']['subject'], $withType);
|
||||
return $this->getDNProp($propName, $this->currentCert['certificationRequestInfo']['subject'], $withType);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -4012,12 +4012,29 @@ class File_X509 {
|
||||
case !is_object($key):
|
||||
return false;
|
||||
case strtolower(get_class($key)) == 'file_asn1_element':
|
||||
// Assume the element is a bitstring-packed key.
|
||||
$asn1 = new File_ASN1();
|
||||
$decoded = $asn1->decodeBER($cert);
|
||||
$decoded = $asn1->decodeBER($key->element);
|
||||
if (empty($decoded)) {
|
||||
return false;
|
||||
}
|
||||
$key = $asn1->asn1map($decoded[0], array('type' => FILE_ASN1_TYPE_BIT_STRING));
|
||||
$raw = $asn1->asn1map($decoded[0], array('type' => FILE_ASN1_TYPE_BIT_STRING));
|
||||
if (empty($raw)) {
|
||||
return false;
|
||||
}
|
||||
$raw = base64_decode($raw);
|
||||
// If the key is private, compute identifier from its corresponding public key.
|
||||
if (!class_exists('Crypt_RSA')) {
|
||||
require_once('Crypt/RSA.php');
|
||||
}
|
||||
$key = new Crypt_RSA();
|
||||
if (!$key->loadKey($raw)) {
|
||||
return false; // Not an unencrypted RSA key.
|
||||
}
|
||||
if ($key->getPrivateKey() !== false) { // If private.
|
||||
return $this->computeKeyIdentifier($key, $method);
|
||||
}
|
||||
$key = $raw; // Is a public key.
|
||||
break;
|
||||
case strtolower(get_class($key)) == 'file_x509':
|
||||
if (isset($key->publicKey)) {
|
||||
|
@ -162,16 +162,6 @@ define('MATH_BIGINTEGER_MODE_BCMATH', 2);
|
||||
define('MATH_BIGINTEGER_MODE_GMP', 3);
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* The largest digit that may be used in addition / subtraction
|
||||
*
|
||||
* (we do pow(2, 52) instead of using 4503599627370496, directly, because some PHP installations
|
||||
* will truncate 4503599627370496)
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
define('MATH_BIGINTEGER_MAX_DIGIT52', pow(2, 52));
|
||||
|
||||
/**
|
||||
* Karatsuba Cutoff
|
||||
*
|
||||
@ -286,6 +276,39 @@ class Math_BigInteger {
|
||||
define('MATH_BIGINTEGER_OPENSSL_ENABLED', true);
|
||||
}
|
||||
|
||||
if (!defined('PHP_INT_SIZE')) {
|
||||
define('PHP_INT_SIZE', 4);
|
||||
}
|
||||
|
||||
if (!defined('MATH_BIGINTEGER_BASE') && MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_INTERNAL) {
|
||||
switch (PHP_INT_SIZE) {
|
||||
case 8: // use 64-bit integers if int size is 8 bytes
|
||||
define('MATH_BIGINTEGER_BASE', 31);
|
||||
define('MATH_BIGINTEGER_BASE_FULL', 0x80000000);
|
||||
define('MATH_BIGINTEGER_MAX_DIGIT', 0x7FFFFFFF);
|
||||
define('MATH_BIGINTEGER_MSB', 0x40000000);
|
||||
// 10**9 is the closest we can get to 2**31 without passing it
|
||||
define('MATH_BIGINTEGER_MAX10', 1000000000);
|
||||
define('MATH_BIGINTEGER_MAX10_LEN', 9);
|
||||
// the largest digit that may be used in addition / subtraction
|
||||
define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 62));
|
||||
break;
|
||||
//case 4: // use 64-bit floats if int size is 4 bytes
|
||||
default:
|
||||
define('MATH_BIGINTEGER_BASE', 26);
|
||||
define('MATH_BIGINTEGER_BASE_FULL', 0x4000000);
|
||||
define('MATH_BIGINTEGER_MAX_DIGIT', 0x3FFFFFF);
|
||||
define('MATH_BIGINTEGER_MSB', 0x2000000);
|
||||
// 10**7 is the closest to 2**26 without passing it
|
||||
define('MATH_BIGINTEGER_MAX10', 10000000);
|
||||
define('MATH_BIGINTEGER_MAX10_LEN', 7);
|
||||
// the largest digit that may be used in addition / subtraction
|
||||
// we do pow(2, 52) instead of using 4503599627370496 directly because some
|
||||
// PHP installations will truncate 4503599627370496.
|
||||
define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 52));
|
||||
}
|
||||
}
|
||||
|
||||
switch ( MATH_BIGINTEGER_MODE ) {
|
||||
case MATH_BIGINTEGER_MODE_GMP:
|
||||
if (is_resource($x) && get_resource_type($x) == 'GMP integer') {
|
||||
@ -338,7 +361,7 @@ class Math_BigInteger {
|
||||
// converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb)
|
||||
default:
|
||||
while (strlen($x)) {
|
||||
$this->value[] = $this->_bytes2int($this->_base256_rshift($x, 26));
|
||||
$this->value[] = $this->_bytes2int($this->_base256_rshift($x, MATH_BIGINTEGER_BASE));
|
||||
}
|
||||
}
|
||||
|
||||
@ -404,21 +427,20 @@ class Math_BigInteger {
|
||||
default:
|
||||
$temp = new Math_BigInteger();
|
||||
|
||||
// array(10000000) is 10**7 in base-2**26. 10**7 is the closest to 2**26 we can get without passing it.
|
||||
$multiplier = new Math_BigInteger();
|
||||
$multiplier->value = array(10000000);
|
||||
$multiplier->value = array(MATH_BIGINTEGER_MAX10);
|
||||
|
||||
if ($x[0] == '-') {
|
||||
$this->is_negative = true;
|
||||
$x = substr($x, 1);
|
||||
}
|
||||
|
||||
$x = str_pad($x, strlen($x) + (6 * strlen($x)) % 7, 0, STR_PAD_LEFT);
|
||||
$x = str_pad($x, strlen($x) + ((MATH_BIGINTEGER_MAX10_LEN - 1) * strlen($x)) % MATH_BIGINTEGER_MAX10_LEN, 0, STR_PAD_LEFT);
|
||||
|
||||
while (strlen($x)) {
|
||||
$temp = $temp->multiply($multiplier);
|
||||
$temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, 7)), 256));
|
||||
$x = substr($x, 7);
|
||||
$temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, MATH_BIGINTEGER_MAX10_LEN)), 256));
|
||||
$x = substr($x, MATH_BIGINTEGER_MAX10_LEN);
|
||||
}
|
||||
|
||||
$this->value = $temp->value;
|
||||
@ -543,7 +565,7 @@ class Math_BigInteger {
|
||||
$temp = $this->copy();
|
||||
|
||||
for ($i = count($temp->value) - 2; $i >= 0; --$i) {
|
||||
$temp->_base256_lshift($result, 26);
|
||||
$temp->_base256_lshift($result, MATH_BIGINTEGER_BASE);
|
||||
$result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
@ -659,11 +681,11 @@ class Math_BigInteger {
|
||||
$temp->is_negative = false;
|
||||
|
||||
$divisor = new Math_BigInteger();
|
||||
$divisor->value = array(10000000); // eg. 10**7
|
||||
$divisor->value = array(MATH_BIGINTEGER_MAX10);
|
||||
$result = '';
|
||||
while (count($temp->value)) {
|
||||
list($temp, $mod) = $temp->divide($divisor);
|
||||
$result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', 7, '0', STR_PAD_LEFT) . $result;
|
||||
$result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', MATH_BIGINTEGER_MAX10_LEN, '0', STR_PAD_LEFT) . $result;
|
||||
}
|
||||
$result = ltrim($result, '0');
|
||||
if (empty($result)) {
|
||||
@ -874,25 +896,25 @@ class Math_BigInteger {
|
||||
|
||||
$carry = 0;
|
||||
for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) {
|
||||
$sum = $x_value[$j] * 0x4000000 + $x_value[$i] + $y_value[$j] * 0x4000000 + $y_value[$i] + $carry;
|
||||
$carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT52; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1
|
||||
$sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT52 : $sum;
|
||||
$sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] + $y_value[$j] * MATH_BIGINTEGER_BASE_FULL + $y_value[$i] + $carry;
|
||||
$carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1
|
||||
$sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT2 : $sum;
|
||||
|
||||
$temp = (int) ($sum / 0x4000000);
|
||||
$temp = (int) ($sum / MATH_BIGINTEGER_BASE_FULL);
|
||||
|
||||
$value[$i] = (int) ($sum - 0x4000000 * $temp); // eg. a faster alternative to fmod($sum, 0x4000000)
|
||||
$value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000)
|
||||
$value[$j] = $temp;
|
||||
}
|
||||
|
||||
if ($j == $size) { // ie. if $y_size is odd
|
||||
$sum = $x_value[$i] + $y_value[$i] + $carry;
|
||||
$carry = $sum >= 0x4000000;
|
||||
$value[$i] = $carry ? $sum - 0x4000000 : $sum;
|
||||
$carry = $sum >= MATH_BIGINTEGER_BASE_FULL;
|
||||
$value[$i] = $carry ? $sum - MATH_BIGINTEGER_BASE_FULL : $sum;
|
||||
++$i; // ie. let $i = $j since we've just done $value[$i]
|
||||
}
|
||||
|
||||
if ($carry) {
|
||||
for (; $value[$i] == 0x3FFFFFF; ++$i) {
|
||||
for (; $value[$i] == MATH_BIGINTEGER_MAX_DIGIT; ++$i) {
|
||||
$value[$i] = 0;
|
||||
}
|
||||
++$value[$i];
|
||||
@ -1010,26 +1032,26 @@ class Math_BigInteger {
|
||||
|
||||
$carry = 0;
|
||||
for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) {
|
||||
$sum = $x_value[$j] * 0x4000000 + $x_value[$i] - $y_value[$j] * 0x4000000 - $y_value[$i] - $carry;
|
||||
$sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] - $y_value[$j] * MATH_BIGINTEGER_BASE_FULL - $y_value[$i] - $carry;
|
||||
$carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1
|
||||
$sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT52 : $sum;
|
||||
$sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT2 : $sum;
|
||||
|
||||
$temp = (int) ($sum / 0x4000000);
|
||||
$temp = (int) ($sum / MATH_BIGINTEGER_BASE_FULL);
|
||||
|
||||
$x_value[$i] = (int) ($sum - 0x4000000 * $temp);
|
||||
$x_value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp);
|
||||
$x_value[$j] = $temp;
|
||||
}
|
||||
|
||||
if ($j == $y_size) { // ie. if $y_size is odd
|
||||
$sum = $x_value[$i] - $y_value[$i] - $carry;
|
||||
$carry = $sum < 0;
|
||||
$x_value[$i] = $carry ? $sum + 0x4000000 : $sum;
|
||||
$x_value[$i] = $carry ? $sum + MATH_BIGINTEGER_BASE_FULL : $sum;
|
||||
++$i;
|
||||
}
|
||||
|
||||
if ($carry) {
|
||||
for (; !$x_value[$i]; ++$i) {
|
||||
$x_value[$i] = 0x3FFFFFF;
|
||||
$x_value[$i] = MATH_BIGINTEGER_MAX_DIGIT;
|
||||
}
|
||||
--$x_value[$i];
|
||||
}
|
||||
@ -1162,8 +1184,8 @@ class Math_BigInteger {
|
||||
|
||||
for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0
|
||||
$temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0
|
||||
$carry = (int) ($temp / 0x4000000);
|
||||
$product_value[$j] = (int) ($temp - 0x4000000 * $carry);
|
||||
$carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
|
||||
$product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
|
||||
}
|
||||
|
||||
$product_value[$j] = $carry;
|
||||
@ -1175,8 +1197,8 @@ class Math_BigInteger {
|
||||
|
||||
for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) {
|
||||
$temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry;
|
||||
$carry = (int) ($temp / 0x4000000);
|
||||
$product_value[$k] = (int) ($temp - 0x4000000 * $carry);
|
||||
$carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
|
||||
$product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
|
||||
}
|
||||
|
||||
$product_value[$k] = $carry;
|
||||
@ -1263,14 +1285,14 @@ class Math_BigInteger {
|
||||
$i2 = $i << 1;
|
||||
|
||||
$temp = $square_value[$i2] + $value[$i] * $value[$i];
|
||||
$carry = (int) ($temp / 0x4000000);
|
||||
$square_value[$i2] = (int) ($temp - 0x4000000 * $carry);
|
||||
$carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
|
||||
$square_value[$i2] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
|
||||
|
||||
// note how we start from $i+1 instead of 0 as we do in multiplication.
|
||||
for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) {
|
||||
$temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry;
|
||||
$carry = (int) ($temp / 0x4000000);
|
||||
$square_value[$k] = (int) ($temp - 0x4000000 * $carry);
|
||||
$carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
|
||||
$square_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
|
||||
}
|
||||
|
||||
// the following line can yield values larger 2**15. at this point, PHP should switch
|
||||
@ -1418,7 +1440,7 @@ class Math_BigInteger {
|
||||
|
||||
// normalize $x and $y as described in HAC 14.23 / 14.24
|
||||
$msb = $y->value[count($y->value) - 1];
|
||||
for ($shift = 0; !($msb & 0x2000000); ++$shift) {
|
||||
for ($shift = 0; !($msb & MATH_BIGINTEGER_MSB); ++$shift) {
|
||||
$msb <<= 1;
|
||||
}
|
||||
$x->_lshift($shift);
|
||||
@ -1465,10 +1487,10 @@ class Math_BigInteger {
|
||||
|
||||
$q_index = $i - $y_max - 1;
|
||||
if ($x_window[0] == $y_window[0]) {
|
||||
$quotient_value[$q_index] = 0x3FFFFFF;
|
||||
$quotient_value[$q_index] = MATH_BIGINTEGER_MAX_DIGIT;
|
||||
} else {
|
||||
$quotient_value[$q_index] = (int) (
|
||||
($x_window[0] * 0x4000000 + $x_window[1])
|
||||
($x_window[0] * MATH_BIGINTEGER_BASE_FULL + $x_window[1])
|
||||
/
|
||||
$y_window[0]
|
||||
);
|
||||
@ -1536,7 +1558,7 @@ class Math_BigInteger {
|
||||
$result = array();
|
||||
|
||||
for ($i = count($dividend) - 1; $i >= 0; --$i) {
|
||||
$temp = 0x4000000 * $carry + $dividend[$i];
|
||||
$temp = MATH_BIGINTEGER_BASE_FULL * $carry + $dividend[$i];
|
||||
$result[$i] = (int) ($temp / $divisor);
|
||||
$carry = (int) ($temp - $divisor * $result[$i]);
|
||||
}
|
||||
@ -1754,7 +1776,7 @@ class Math_BigInteger {
|
||||
$e_length = count($e_value) - 1;
|
||||
$e_bits = decbin($e_value[$e_length]);
|
||||
for ($i = $e_length - 1; $i >= 0; --$i) {
|
||||
$e_bits.= str_pad(decbin($e_value[$i]), 26, '0', STR_PAD_LEFT);
|
||||
$e_bits.= str_pad(decbin($e_value[$i]), MATH_BIGINTEGER_BASE, '0', STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
$e_length = strlen($e_bits);
|
||||
@ -2089,7 +2111,7 @@ class Math_BigInteger {
|
||||
if ($this->_compare($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]) < 0) {
|
||||
$corrector_value = $this->_array_repeat(0, $n_length + 1);
|
||||
$corrector_value[] = 1;
|
||||
$result = $this->_add($result, false, $corrector, false);
|
||||
$result = $this->_add($result, false, $corrector_value, false);
|
||||
$result = $result[MATH_BIGINTEGER_VALUE];
|
||||
}
|
||||
|
||||
@ -2148,8 +2170,8 @@ class Math_BigInteger {
|
||||
|
||||
for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i
|
||||
$temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0
|
||||
$carry = (int) ($temp / 0x4000000);
|
||||
$product_value[$j] = (int) ($temp - 0x4000000 * $carry);
|
||||
$carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
|
||||
$product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
|
||||
}
|
||||
|
||||
if ($j < $stop) {
|
||||
@ -2164,8 +2186,8 @@ class Math_BigInteger {
|
||||
|
||||
for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) {
|
||||
$temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry;
|
||||
$carry = (int) ($temp / 0x4000000);
|
||||
$product_value[$k] = (int) ($temp - 0x4000000 * $carry);
|
||||
$carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
|
||||
$product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
|
||||
}
|
||||
|
||||
if ($k < $stop) {
|
||||
@ -2213,7 +2235,7 @@ class Math_BigInteger {
|
||||
|
||||
for ($i = 0; $i < $k; ++$i) {
|
||||
$temp = $result[MATH_BIGINTEGER_VALUE][$i] * $cache[MATH_BIGINTEGER_DATA][$key];
|
||||
$temp = (int) ($temp - 0x4000000 * ((int) ($temp / 0x4000000)));
|
||||
$temp = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * ((int) ($temp / MATH_BIGINTEGER_BASE_FULL)));
|
||||
$temp = $this->_regularMultiply(array($temp), $n);
|
||||
$temp = array_merge($this->_array_repeat(0, $i), $temp);
|
||||
$result = $this->_add($result[MATH_BIGINTEGER_VALUE], false, $temp, false);
|
||||
@ -2265,9 +2287,9 @@ class Math_BigInteger {
|
||||
$a = array(MATH_BIGINTEGER_VALUE => $this->_array_repeat(0, $n + 1));
|
||||
for ($i = 0; $i < $n; ++$i) {
|
||||
$temp = $a[MATH_BIGINTEGER_VALUE][0] + $x[$i] * $y[0];
|
||||
$temp = (int) ($temp - 0x4000000 * ((int) ($temp / 0x4000000)));
|
||||
$temp = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * ((int) ($temp / MATH_BIGINTEGER_BASE_FULL)));
|
||||
$temp = $temp * $cache[MATH_BIGINTEGER_DATA][$key];
|
||||
$temp = (int) ($temp - 0x4000000 * ((int) ($temp / 0x4000000)));
|
||||
$temp = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * ((int) ($temp / MATH_BIGINTEGER_BASE_FULL)));
|
||||
$temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false);
|
||||
$a = $this->_add($a[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false);
|
||||
$a[MATH_BIGINTEGER_VALUE] = array_slice($a[MATH_BIGINTEGER_VALUE], 1);
|
||||
@ -2325,15 +2347,15 @@ class Math_BigInteger {
|
||||
* @param Array $x
|
||||
* @return Integer
|
||||
*/
|
||||
function _modInverse67108864($x) // 2**26 == 67108864
|
||||
function _modInverse67108864($x) // 2**26 == 67,108,864
|
||||
{
|
||||
$x = -$x[0];
|
||||
$result = $x & 0x3; // x**-1 mod 2**2
|
||||
$result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4
|
||||
$result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8
|
||||
$result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16
|
||||
$result = fmod($result * (2 - fmod($x * $result, 0x4000000)), 0x4000000); // x**-1 mod 2**26
|
||||
return $result & 0x3FFFFFF;
|
||||
$result = fmod($result * (2 - fmod($x * $result, MATH_BIGINTEGER_BASE_FULL)), MATH_BIGINTEGER_BASE_FULL); // x**-1 mod 2**26
|
||||
return $result & MATH_BIGINTEGER_MAX_DIGIT;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2402,12 +2424,12 @@ class Math_BigInteger {
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the greatest common divisor and Bézout's identity.
|
||||
* Calculates the greatest common divisor and Bezout's identity.
|
||||
*
|
||||
* Say you have 693 and 609. The GCD is 21. Bézout's identity states that there exist integers x and y such that
|
||||
* Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that
|
||||
* 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which
|
||||
* combination is returned is dependant upon which mode is in use. See
|
||||
* {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bézout's identity - Wikipedia} for more information.
|
||||
* {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information.
|
||||
*
|
||||
* Here's an example:
|
||||
* <code>
|
||||
@ -2736,7 +2758,7 @@ class Math_BigInteger {
|
||||
$result->value = array_slice($result->value, 0, $length);
|
||||
|
||||
for ($i = 0; $i < $length; ++$i) {
|
||||
$result->value[$i] = $result->value[$i] & $x->value[$i];
|
||||
$result->value[$i]&= $x->value[$i];
|
||||
}
|
||||
|
||||
return $this->_normalize($result);
|
||||
@ -2772,11 +2794,11 @@ class Math_BigInteger {
|
||||
|
||||
$length = max(count($this->value), count($x->value));
|
||||
$result = $this->copy();
|
||||
$result->value = array_pad($result->value, 0, $length);
|
||||
$x->value = array_pad($x->value, 0, $length);
|
||||
$result->value = array_pad($result->value, $length, 0);
|
||||
$x->value = array_pad($x->value, $length, 0);
|
||||
|
||||
for ($i = 0; $i < $length; ++$i) {
|
||||
$result->value[$i] = $this->value[$i] | $x->value[$i];
|
||||
$result->value[$i]|= $x->value[$i];
|
||||
}
|
||||
|
||||
return $this->_normalize($result);
|
||||
@ -2812,11 +2834,11 @@ class Math_BigInteger {
|
||||
|
||||
$length = max(count($this->value), count($x->value));
|
||||
$result = $this->copy();
|
||||
$result->value = array_pad($result->value, 0, $length);
|
||||
$x->value = array_pad($x->value, 0, $length);
|
||||
$result->value = array_pad($result->value, $length, 0);
|
||||
$x->value = array_pad($x->value, $length, 0);
|
||||
|
||||
for ($i = 0; $i < $length; ++$i) {
|
||||
$result->value[$i] = $this->value[$i] ^ $x->value[$i];
|
||||
$result->value[$i]^= $x->value[$i];
|
||||
}
|
||||
|
||||
return $this->_normalize($result);
|
||||
@ -3375,16 +3397,16 @@ class Math_BigInteger {
|
||||
return;
|
||||
}
|
||||
|
||||
$num_digits = (int) ($shift / 26);
|
||||
$shift %= 26;
|
||||
$num_digits = (int) ($shift / MATH_BIGINTEGER_BASE);
|
||||
$shift %= MATH_BIGINTEGER_BASE;
|
||||
$shift = 1 << $shift;
|
||||
|
||||
$carry = 0;
|
||||
|
||||
for ($i = 0; $i < count($this->value); ++$i) {
|
||||
$temp = $this->value[$i] * $shift + $carry;
|
||||
$carry = (int) ($temp / 0x4000000);
|
||||
$this->value[$i] = (int) ($temp - $carry * 0x4000000);
|
||||
$carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
|
||||
$this->value[$i] = (int) ($temp - $carry * MATH_BIGINTEGER_BASE_FULL);
|
||||
}
|
||||
|
||||
if ( $carry ) {
|
||||
@ -3410,9 +3432,9 @@ class Math_BigInteger {
|
||||
return;
|
||||
}
|
||||
|
||||
$num_digits = (int) ($shift / 26);
|
||||
$shift %= 26;
|
||||
$carry_shift = 26 - $shift;
|
||||
$num_digits = (int) ($shift / MATH_BIGINTEGER_BASE);
|
||||
$shift %= MATH_BIGINTEGER_BASE;
|
||||
$carry_shift = MATH_BIGINTEGER_BASE - $shift;
|
||||
$carry_mask = (1 << $shift) - 1;
|
||||
|
||||
if ( $num_digits ) {
|
||||
@ -3630,4 +3652,4 @@ class Math_BigInteger {
|
||||
$temp = ltrim(pack('N', $length), chr(0));
|
||||
return pack('Ca*', 0x80 | strlen($temp), $temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1137,10 +1137,49 @@ class Net_SFTP extends Net_SSH2 {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes file or directory owner
|
||||
*
|
||||
* Returns TRUE on success or FALSE on error.
|
||||
*
|
||||
* @param String $filename
|
||||
* @param Integer $uid
|
||||
* @param optional Boolean $recursive
|
||||
* @return Boolean
|
||||
* @access public
|
||||
*/
|
||||
function chown($filename, $uid, $recursive = false)
|
||||
{
|
||||
// quoting from <http://www.kernel.org/doc/man-pages/online/pages/man2/chown.2.html>,
|
||||
// "if the owner or group is specified as -1, then that ID is not changed"
|
||||
$attr = pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1);
|
||||
|
||||
return $this->_setstat($filename, $attr, $recursive);
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes file or directory group
|
||||
*
|
||||
* Returns TRUE on success or FALSE on error.
|
||||
*
|
||||
* @param String $filename
|
||||
* @param Integer $gid
|
||||
* @param optional Boolean $recursive
|
||||
* @return Boolean
|
||||
* @access public
|
||||
*/
|
||||
function chgrp($filename, $gid, $recursive = false)
|
||||
{
|
||||
$attr = pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid);
|
||||
|
||||
return $this->_setstat($filename, $attr, $recursive);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set permissions on a file.
|
||||
*
|
||||
* Returns the new file permissions on success or FALSE on error.
|
||||
* If $recursive is true than this just returns TRUE or FALSE.
|
||||
*
|
||||
* @param Integer $mode
|
||||
* @param String $filename
|
||||
@ -1150,51 +1189,18 @@ class Net_SFTP extends Net_SSH2 {
|
||||
*/
|
||||
function chmod($mode, $filename, $recursive = false)
|
||||
{
|
||||
if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_string($mode) && is_int($filename)) {
|
||||
$temp = $mode;
|
||||
$mode = $filename;
|
||||
$filename = $temp;
|
||||
}
|
||||
|
||||
$filename = $this->_realpath($filename);
|
||||
if ($filename === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($recursive) {
|
||||
$i = 0;
|
||||
$result = $this->_chmod_recursive($mode, $filename, $i);
|
||||
$this->_read_put_responses($i);
|
||||
return $result;
|
||||
}
|
||||
|
||||
// SFTPv4+ has an additional byte field - type - that would need to be sent, as well. setting it to
|
||||
// SSH_FILEXFER_TYPE_UNKNOWN might work. if not, we'd have to do an SSH_FXP_STAT before doing an SSH_FXP_SETSTAT.
|
||||
$attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777);
|
||||
if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($filename), $filename, $attr))) {
|
||||
if (!$this->_setstat($filename, $attr, $recursive)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
"Because some systems must use separate system calls to set various attributes, it is possible that a failure
|
||||
response will be returned, but yet some of the attributes may be have been successfully modified. If possible,
|
||||
servers SHOULD avoid this situation; however, clients MUST be aware that this is possible."
|
||||
|
||||
-- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6
|
||||
*/
|
||||
$response = $this->_get_sftp_packet();
|
||||
if ($this->packet_type != NET_SFTP_STATUS) {
|
||||
user_error('Expected SSH_FXP_STATUS');
|
||||
return false;
|
||||
}
|
||||
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
$this->_logError($response, $status);
|
||||
if ($recursive) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// rather than return what the permissions *should* be, we'll return what they actually are. this will also
|
||||
@ -1220,16 +1226,72 @@ class Net_SFTP extends Net_SSH2 {
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively chmods directories on the SFTP server
|
||||
* Sets information about a file
|
||||
*
|
||||
* Minimizes directory lookups and SSH_FXP_STATUS requests for speed.
|
||||
*
|
||||
* @param Integer $mode
|
||||
* @param String $filename
|
||||
* @param String $attr
|
||||
* @param Boolean $recursive
|
||||
* @return Boolean
|
||||
* @access private
|
||||
*/
|
||||
function _chmod_recursive($mode, $path, &$i)
|
||||
function _setstat($filename, $attr, $recursive)
|
||||
{
|
||||
if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$filename = $this->_realpath($filename);
|
||||
if ($filename === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($recursive) {
|
||||
$i = 0;
|
||||
$result = $this->_setstat_recursive($filename, $attr, $i);
|
||||
$this->_read_put_responses($i);
|
||||
return $result;
|
||||
}
|
||||
|
||||
// SFTPv4+ has an additional byte field - type - that would need to be sent, as well. setting it to
|
||||
// SSH_FILEXFER_TYPE_UNKNOWN might work. if not, we'd have to do an SSH_FXP_STAT before doing an SSH_FXP_SETSTAT.
|
||||
if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($filename), $filename, $attr))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
"Because some systems must use separate system calls to set various attributes, it is possible that a failure
|
||||
response will be returned, but yet some of the attributes may be have been successfully modified. If possible,
|
||||
servers SHOULD avoid this situation; however, clients MUST be aware that this is possible."
|
||||
|
||||
-- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6
|
||||
*/
|
||||
$response = $this->_get_sftp_packet();
|
||||
if ($this->packet_type != NET_SFTP_STATUS) {
|
||||
user_error('Expected SSH_FXP_STATUS');
|
||||
return false;
|
||||
}
|
||||
|
||||
extract(unpack('Nstatus', $this->_string_shift($response, 4)));
|
||||
if ($status != NET_SFTP_STATUS_OK) {
|
||||
$this->_logError($response, $status);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively sets information on directories on the SFTP server
|
||||
*
|
||||
* Minimizes directory lookups and SSH_FXP_STATUS requests for speed.
|
||||
*
|
||||
* @param String $path
|
||||
* @param String $attr
|
||||
* @param Integer $i
|
||||
* @return Boolean
|
||||
* @access private
|
||||
*/
|
||||
function _setstat_recursive($path, $attr, &$i)
|
||||
{
|
||||
if (!$this->_read_put_responses($i)) {
|
||||
return false;
|
||||
@ -1238,7 +1300,7 @@ class Net_SFTP extends Net_SSH2 {
|
||||
$entries = $this->_list($path, true, false);
|
||||
|
||||
if ($entries === false) {
|
||||
return $this->chmod($mode, $path);
|
||||
return $this->_setstat($path, $attr, false);
|
||||
}
|
||||
|
||||
// normally $entries would have at least . and .. but it might not if the directories
|
||||
@ -1258,11 +1320,10 @@ class Net_SFTP extends Net_SSH2 {
|
||||
|
||||
$temp = $path . '/' . $filename;
|
||||
if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) {
|
||||
if (!$this->_chmod_recursive($mode, $temp, $i)) {
|
||||
if (!$this->_setstat_recursive($temp, $attr, $i)) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
$attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777);
|
||||
if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($temp), $temp, $attr))) {
|
||||
return false;
|
||||
}
|
||||
@ -1278,7 +1339,6 @@ class Net_SFTP extends Net_SSH2 {
|
||||
}
|
||||
}
|
||||
|
||||
$attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777);
|
||||
if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($path), $path, $attr))) {
|
||||
return false;
|
||||
}
|
||||
|
@ -935,7 +935,7 @@ class Net_SSH1 {
|
||||
* Returns the output of an interactive shell when no more output is available.
|
||||
*
|
||||
* Requires PHP 4.3.0 or later due to the use of the stream_select() function. If you see stuff like
|
||||
* "[00m", you're seeing ANSI escape codes. According to
|
||||
* "^[[00m", you're seeing ANSI escape codes. According to
|
||||
* {@link http://support.microsoft.com/kb/101875 How to Enable ANSI.SYS in a Command Window}, "Windows NT
|
||||
* does not support ANSI escape sequences in Win32 Console applications", so if you're a Windows user,
|
||||
* there's not going to be much recourse.
|
||||
@ -1574,4 +1574,4 @@ class Net_SSH1 {
|
||||
fputs($this->realtime_log_file, $entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2076,6 +2076,16 @@ class Net_SSH2 {
|
||||
$this->disconnect();
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the connection still active?
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function isConnected()
|
||||
{
|
||||
return $this->bitmap & NET_SSH2_MASK_LOGIN;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets Binary Packets
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user