commit
cc0002e833
|
@ -1,3 +1,4 @@
|
|||
/.settings/
|
||||
/.buildpath
|
||||
/.project
|
||||
/.Readme.md.html
|
||||
|
|
|
@ -3,9 +3,16 @@ LDAP Account Manager
|
|||
|
||||
LDAP Account Manager (LAM) is a webfrontend for managing entries (e.g. users, groups, DHCP settings) stored in an LDAP directory. LAM was designed to make LDAP management as easy as possible for the user. It abstracts from the technical details of LDAP and allows persons without technical background to manage LDAP entries. If needed, power users may still directly edit LDAP entries via the integrated LDAP browser.
|
||||
|
||||
![LAM](https://www.ldap-account-manager.org/lamcms/sites/default/files/styles/slideshow/public/userList.png)
|
||||
|
||||
![LAM](https://www.ldap-account-manager.org/lamcms/sites/default/files/styles/slideshow/public/user_0.png)
|
||||
|
||||
# Download
|
||||
You can get the newest version at https://www.ldap-account-manager.org/.
|
||||
|
||||
# Documentation
|
||||
Please see the [documentation area](https://www.ldap-account-manager.org/lamcms/documentation).
|
||||
|
||||
# Source code
|
||||
|
||||
There are two modules. Usually, you only need the files inside "lam".
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
December 2017
|
||||
- PHP 5.6 and Internet Explorer 11 or later required
|
||||
|
||||
|
||||
19.09.2017 6.1
|
||||
- Automatically trim input fields to avoid trailing/leading spaces
|
||||
- LAM Pro:
|
||||
|
@ -8,11 +12,13 @@
|
|||
-> Password modify page reports error on password change when posixAccount is present for users
|
||||
-> Nginx configuration files did not include "fastcgi_param SCRIPT_FILENAME $request_filename;" (193)
|
||||
|
||||
|
||||
20.07.2017 6.0.1
|
||||
- Fixed bugs:
|
||||
-> Configuration file fills up with empty values
|
||||
-> Tool visibility settings
|
||||
|
||||
|
||||
26.06.2017 6.0
|
||||
- Support multiple configurations for same account type
|
||||
- PHP 7.1 compatibility
|
||||
|
|
|
@ -15,7 +15,7 @@ LAM - Readme
|
|||
|
||||
https://www.ldap-account-manager.org/
|
||||
|
||||
Copyright (C) 2003 - 2016 Roland Gruber <post@rolandgruber.de>
|
||||
Copyright (C) 2003 - 2017 Roland Gruber <post@rolandgruber.de>
|
||||
|
||||
Installation and documentation:
|
||||
Please see the LAM manual in docs/manual/index.html.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
This software is copyright (c) 2003 - 2016 by Roland Gruber
|
||||
This software is copyright (c) 2003 - 2017 by Roland Gruber
|
||||
|
||||
If you purchased a copy of LDAP Account Manager Pro then the following
|
||||
files are licensed under the conditions which you accepted at purchase
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Apache/Nginx webserver (SSL recommended) with PHP module (PHP
|
||||
(>= 5.4.0) with ldap, gettext, xml, openssl and optional
|
||||
(>= 5.6.0) with ldap, gettext, xml, openssl and optional
|
||||
OpenSSL)</para>
|
||||
</listitem>
|
||||
|
||||
|
@ -44,7 +44,7 @@
|
|||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Internet Explorer 9 <emphasis role="bold">(compatibility
|
||||
<para>Internet Explorer 11 <emphasis role="bold">(compatibility
|
||||
mode turned off)</emphasis></para>
|
||||
</listitem>
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>PHP (>= 5.4.0)</para>
|
||||
<para>PHP (>= 5.6.0)</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
|
@ -85,7 +85,7 @@
|
|||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>Internet Explorer 9<emphasis role="bold"> (compatibility mode
|
||||
<para>Internet Explorer 11<emphasis role="bold"> (compatibility mode
|
||||
turned off)</emphasis></para>
|
||||
</listitem>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Uses mcrypt, if available/possible, and an internal implementation, otherwise.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* NOTE: Since AES.php is (for compatibility and phpseclib-historical reasons) virtually
|
||||
* just a wrapper to Rijndael.php you may consider using Rijndael.php instead of
|
||||
|
@ -16,16 +16,16 @@
|
|||
* it'll be null-padded to 192-bits and 192 bits will be the key length until {@link self::setKey() setKey()}
|
||||
* is called, again, at which point, it'll be recalculated.
|
||||
*
|
||||
* Since Crypt_AES extends Crypt_Rijndael, some functions are available to be called that, in the context of AES, don't
|
||||
* Since \phpseclib\Crypt\AES extends \phpseclib\Crypt\Rijndael, some functions are available to be called that, in the context of AES, don't
|
||||
* make a whole lot of sense. {@link self::setBlockLength() setBlockLength()}, for instance. Calling that function,
|
||||
* however possible, won't do anything (AES has a fixed block length whereas Rijndael has a variable one).
|
||||
*
|
||||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/AES.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $aes = new Crypt_AES();
|
||||
* $aes = new \phpseclib\Crypt\AES();
|
||||
*
|
||||
* $aes->setKey('abcdefghijklmnop');
|
||||
*
|
||||
|
@ -39,102 +39,31 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_AES
|
||||
* @package AES
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2008 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include Crypt_Rijndael
|
||||
*/
|
||||
if (!class_exists('Crypt_Rijndael')) {
|
||||
include_once 'Rijndael.php';
|
||||
}
|
||||
|
||||
/**#@+
|
||||
* @access public
|
||||
* @see self::encrypt()
|
||||
* @see self::decrypt()
|
||||
*/
|
||||
/**
|
||||
* Encrypt / decrypt using the Counter mode.
|
||||
*
|
||||
* Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
|
||||
*/
|
||||
define('CRYPT_AES_MODE_CTR', CRYPT_MODE_CTR);
|
||||
/**
|
||||
* Encrypt / decrypt using the Electronic Code Book mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
|
||||
*/
|
||||
define('CRYPT_AES_MODE_ECB', CRYPT_MODE_ECB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Code Book Chaining mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
|
||||
*/
|
||||
define('CRYPT_AES_MODE_CBC', CRYPT_MODE_CBC);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
|
||||
*/
|
||||
define('CRYPT_AES_MODE_CFB', CRYPT_MODE_CFB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
|
||||
*/
|
||||
define('CRYPT_AES_MODE_OFB', CRYPT_MODE_OFB);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of AES.
|
||||
*
|
||||
* @package Crypt_AES
|
||||
* @package AES
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Crypt_AES extends Crypt_Rijndael
|
||||
class AES extends Rijndael
|
||||
{
|
||||
/**
|
||||
* The namespace used by the cipher for its constants.
|
||||
*
|
||||
* @see Crypt_Base::const_namespace
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $const_namespace = 'AES';
|
||||
|
||||
/**
|
||||
* Dummy function
|
||||
*
|
||||
* Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything.
|
||||
* Since \phpseclib\Crypt\AES extends \phpseclib\Crypt\Rijndael, this function is, technically, available, but it doesn't do anything.
|
||||
*
|
||||
* @see Crypt_Rijndael::setBlockLength()
|
||||
* @see \phpseclib\Crypt\Rijndael::setBlockLength()
|
||||
* @access public
|
||||
* @param int $length
|
||||
*/
|
||||
|
@ -149,7 +78,7 @@ class Crypt_AES extends Crypt_Rijndael
|
|||
* Valid key lengths are 128, 192, and 256. If the length is less than 128, it will be rounded up to
|
||||
* 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount.
|
||||
*
|
||||
* @see Crypt_Rijndael:setKeyLength()
|
||||
* @see \phpseclib\Crypt\Rijndael:setKeyLength()
|
||||
* @access public
|
||||
* @param int $length
|
||||
*/
|
||||
|
@ -170,7 +99,7 @@ class Crypt_AES extends Crypt_Rijndael
|
|||
*
|
||||
* Rijndael supports five different key lengths, AES only supports three.
|
||||
*
|
||||
* @see Crypt_Rijndael:setKey()
|
||||
* @see \phpseclib\Crypt\Rijndael:setKey()
|
||||
* @see setKeyLength()
|
||||
* @access public
|
||||
* @param string $key
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* Useful resources are as follows:
|
||||
*
|
||||
|
@ -14,9 +14,9 @@
|
|||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/Blowfish.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $blowfish = new Crypt_Blowfish();
|
||||
* $blowfish = new \phpseclib\Crypt\Blowfish();
|
||||
*
|
||||
* $blowfish->setKey('12345678901234567890123456789012');
|
||||
*
|
||||
|
@ -26,26 +26,8 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_Blowfish
|
||||
* @package Blowfish
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @author Hans-Juergen Petrich <petrich@tronic-media.com>
|
||||
* @copyright 2007 Jim Wigginton
|
||||
|
@ -53,86 +35,31 @@
|
|||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include Crypt_Base
|
||||
*
|
||||
* Base cipher class
|
||||
*/
|
||||
if (!class_exists('Crypt_Base')) {
|
||||
include_once 'Base.php';
|
||||
}
|
||||
|
||||
/**#@+
|
||||
* @access public
|
||||
* @see self::encrypt()
|
||||
* @see self::decrypt()
|
||||
*/
|
||||
/**
|
||||
* Encrypt / decrypt using the Counter mode.
|
||||
*
|
||||
* Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
|
||||
*/
|
||||
define('CRYPT_BLOWFISH_MODE_CTR', CRYPT_MODE_CTR);
|
||||
/**
|
||||
* Encrypt / decrypt using the Electronic Code Book mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
|
||||
*/
|
||||
define('CRYPT_BLOWFISH_MODE_ECB', CRYPT_MODE_ECB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Code Book Chaining mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
|
||||
*/
|
||||
define('CRYPT_BLOWFISH_MODE_CBC', CRYPT_MODE_CBC);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
|
||||
*/
|
||||
define('CRYPT_BLOWFISH_MODE_CFB', CRYPT_MODE_CFB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
|
||||
*/
|
||||
define('CRYPT_BLOWFISH_MODE_OFB', CRYPT_MODE_OFB);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of Blowfish.
|
||||
*
|
||||
* @package Crypt_Blowfish
|
||||
* @package Blowfish
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @author Hans-Juergen Petrich <petrich@tronic-media.com>
|
||||
* @access public
|
||||
*/
|
||||
class Crypt_Blowfish extends Crypt_Base
|
||||
class Blowfish extends Base
|
||||
{
|
||||
/**
|
||||
* Block Length of the cipher
|
||||
*
|
||||
* @see Crypt_Base::block_size
|
||||
* @see \phpseclib\Crypt\Base::block_size
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $block_size = 8;
|
||||
|
||||
/**
|
||||
* The namespace used by the cipher for its constants.
|
||||
*
|
||||
* @see Crypt_Base::const_namespace
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $const_namespace = 'BLOWFISH';
|
||||
|
||||
/**
|
||||
* The mcrypt specific name of the cipher
|
||||
*
|
||||
* @see Crypt_Base::cipher_name_mcrypt
|
||||
* @see \phpseclib\Crypt\Base::cipher_name_mcrypt
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
|
@ -141,7 +68,7 @@ class Crypt_Blowfish extends Crypt_Base
|
|||
/**
|
||||
* Optimizing value while CFB-encrypting
|
||||
*
|
||||
* @see Crypt_Base::cfb_init_len
|
||||
* @see \phpseclib\Crypt\Base::cfb_init_len
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
|
@ -346,7 +273,7 @@ class Crypt_Blowfish extends Crypt_Base
|
|||
/**
|
||||
* The Key Length (in bytes)
|
||||
*
|
||||
* @see Crypt_Base::setKeyLength()
|
||||
* @see \phpseclib\Crypt\Base::setKeyLength()
|
||||
* @var int
|
||||
* @access private
|
||||
* @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk
|
||||
|
@ -380,17 +307,20 @@ class Crypt_Blowfish extends Crypt_Base
|
|||
/**
|
||||
* Test for engine validity
|
||||
*
|
||||
* This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
|
||||
* This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine()
|
||||
*
|
||||
* @see Crypt_Base::isValidEngine()
|
||||
* @see \phpseclib\Crypt\Base::isValidEngine()
|
||||
* @param int $engine
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function isValidEngine($engine)
|
||||
{
|
||||
if ($engine == CRYPT_ENGINE_OPENSSL) {
|
||||
if ($this->key_length != 16) {
|
||||
if ($engine == self::ENGINE_OPENSSL) {
|
||||
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';
|
||||
|
@ -403,7 +333,7 @@ class Crypt_Blowfish extends Crypt_Base
|
|||
/**
|
||||
* Setup the key (expansion)
|
||||
*
|
||||
* @see Crypt_Base::_setupKey()
|
||||
* @see \phpseclib\Crypt\Base::_setupKey()
|
||||
* @access private
|
||||
*/
|
||||
function _setupKey()
|
||||
|
@ -530,15 +460,15 @@ class Crypt_Blowfish extends Crypt_Base
|
|||
/**
|
||||
* Setup the performance-optimized function for de/encrypt()
|
||||
*
|
||||
* @see Crypt_Base::_setupInlineCrypt()
|
||||
* @see \phpseclib\Crypt\Base::_setupInlineCrypt()
|
||||
* @access private
|
||||
*/
|
||||
function _setupInlineCrypt()
|
||||
{
|
||||
$lambda_functions =& Crypt_Blowfish::_getLambdaFunctions();
|
||||
$lambda_functions =& self::_getLambdaFunctions();
|
||||
|
||||
// We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
|
||||
// (Currently, for Crypt_Blowfish, one generated $lambda_function cost on php5.5@32bit ~100kb unfreeable mem and ~180kb on php5.5@64bit)
|
||||
// (Currently, for Blowfish, one generated $lambda_function cost on php5.5@32bit ~100kb unfreeable mem and ~180kb on php5.5@64bit)
|
||||
// After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one.
|
||||
$gen_hi_opt_code = (bool)(count($lambda_functions) < 10);
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* Useful resources are as follows:
|
||||
*
|
||||
|
@ -16,9 +16,9 @@
|
|||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/DES.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $des = new Crypt_DES();
|
||||
* $des = new \phpseclib\Crypt\DES();
|
||||
*
|
||||
* $des->setKey('abcdefgh');
|
||||
*
|
||||
|
@ -32,108 +32,44 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_DES
|
||||
* @package DES
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2007 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include Crypt_Base
|
||||
*
|
||||
* Base cipher class
|
||||
*/
|
||||
if (!class_exists('Crypt_Base')) {
|
||||
include_once 'Base.php';
|
||||
}
|
||||
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see self::_setupKey()
|
||||
* @see self::_processBlock()
|
||||
*/
|
||||
/**
|
||||
* Contains $keys[CRYPT_DES_ENCRYPT]
|
||||
*/
|
||||
define('CRYPT_DES_ENCRYPT', 0);
|
||||
/**
|
||||
* Contains $keys[CRYPT_DES_DECRYPT]
|
||||
*/
|
||||
define('CRYPT_DES_DECRYPT', 1);
|
||||
/**#@-*/
|
||||
|
||||
/**#@+
|
||||
* @access public
|
||||
* @see self::encrypt()
|
||||
* @see self::decrypt()
|
||||
*/
|
||||
/**
|
||||
* Encrypt / decrypt using the Counter mode.
|
||||
*
|
||||
* Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
|
||||
*/
|
||||
define('CRYPT_DES_MODE_CTR', CRYPT_MODE_CTR);
|
||||
/**
|
||||
* Encrypt / decrypt using the Electronic Code Book mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
|
||||
*/
|
||||
define('CRYPT_DES_MODE_ECB', CRYPT_MODE_ECB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Code Book Chaining mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
|
||||
*/
|
||||
define('CRYPT_DES_MODE_CBC', CRYPT_MODE_CBC);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
|
||||
*/
|
||||
define('CRYPT_DES_MODE_CFB', CRYPT_MODE_CFB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
|
||||
*/
|
||||
define('CRYPT_DES_MODE_OFB', CRYPT_MODE_OFB);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of DES.
|
||||
*
|
||||
* @package Crypt_DES
|
||||
* @package DES
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Crypt_DES extends Crypt_Base
|
||||
class DES extends Base
|
||||
{
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see \phpseclib\Crypt\DES::_setupKey()
|
||||
* @see \phpseclib\Crypt\DES::_processBlock()
|
||||
*/
|
||||
/**
|
||||
* Contains $keys[self::ENCRYPT]
|
||||
*/
|
||||
const ENCRYPT = 0;
|
||||
/**
|
||||
* Contains $keys[self::DECRYPT]
|
||||
*/
|
||||
const DECRYPT = 1;
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Block Length of the cipher
|
||||
*
|
||||
* @see Crypt_Base::block_size
|
||||
* @see \phpseclib\Crypt\Base::block_size
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
|
@ -142,25 +78,16 @@ class Crypt_DES extends Crypt_Base
|
|||
/**
|
||||
* Key Length (in bytes)
|
||||
*
|
||||
* @see Crypt_Base::setKeyLength()
|
||||
* @see \phpseclib\Crypt\Base::setKeyLength()
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $key_length = 8;
|
||||
|
||||
/**
|
||||
* The namespace used by the cipher for its constants.
|
||||
*
|
||||
* @see Crypt_Base::const_namespace
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $const_namespace = 'DES';
|
||||
|
||||
/**
|
||||
* The mcrypt specific name of the cipher
|
||||
*
|
||||
* @see Crypt_Base::cipher_name_mcrypt
|
||||
* @see \phpseclib\Crypt\Base::cipher_name_mcrypt
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
|
@ -169,22 +96,22 @@ class Crypt_DES extends Crypt_Base
|
|||
/**
|
||||
* The OpenSSL names of the cipher / modes
|
||||
*
|
||||
* @see Crypt_Base::openssl_mode_names
|
||||
* @see \phpseclib\Crypt\Base::openssl_mode_names
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $openssl_mode_names = array(
|
||||
CRYPT_MODE_ECB => 'des-ecb',
|
||||
CRYPT_MODE_CBC => 'des-cbc',
|
||||
CRYPT_MODE_CFB => 'des-cfb',
|
||||
CRYPT_MODE_OFB => 'des-ofb'
|
||||
// CRYPT_MODE_CTR is undefined for DES
|
||||
self::MODE_ECB => 'des-ecb',
|
||||
self::MODE_CBC => 'des-cbc',
|
||||
self::MODE_CFB => 'des-cfb',
|
||||
self::MODE_OFB => 'des-ofb'
|
||||
// self::MODE_CTR is undefined for DES
|
||||
);
|
||||
|
||||
/**
|
||||
* Optimizing value while CFB-encrypting
|
||||
*
|
||||
* @see Crypt_Base::cfb_init_len
|
||||
* @see \phpseclib\Crypt\Base::cfb_init_len
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
|
@ -193,7 +120,7 @@ class Crypt_DES extends Crypt_Base
|
|||
/**
|
||||
* Switch for DES/3DES encryption
|
||||
*
|
||||
* Used only if $engine == CRYPT_DES_MODE_INTERNAL
|
||||
* Used only if $engine == self::ENGINE_INTERNAL
|
||||
*
|
||||
* @see self::_setupKey()
|
||||
* @see self::_processBlock()
|
||||
|
@ -654,9 +581,9 @@ class Crypt_DES extends Crypt_Base
|
|||
/**
|
||||
* Test for engine validity
|
||||
*
|
||||
* This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
|
||||
* This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine()
|
||||
*
|
||||
* @see Crypt_Base::isValidEngine()
|
||||
* @see \phpseclib\Crypt\Base::isValidEngine()
|
||||
* @param int $engine
|
||||
* @access public
|
||||
* @return bool
|
||||
|
@ -664,7 +591,7 @@ class Crypt_DES extends Crypt_Base
|
|||
function isValidEngine($engine)
|
||||
{
|
||||
if ($this->key_length_max == 8) {
|
||||
if ($engine == CRYPT_ENGINE_OPENSSL) {
|
||||
if ($engine == self::ENGINE_OPENSSL) {
|
||||
$this->cipher_name_openssl_ecb = 'des-ecb';
|
||||
$this->cipher_name_openssl = 'des-' . $this->_openssl_translate_mode();
|
||||
}
|
||||
|
@ -684,7 +611,7 @@ class Crypt_DES extends Crypt_Base
|
|||
*
|
||||
* If the key is not explicitly set, it'll be assumed to be all zero's.
|
||||
*
|
||||
* @see Crypt_Base::setKey()
|
||||
* @see \phpseclib\Crypt\Base::setKey()
|
||||
* @access public
|
||||
* @param string $key
|
||||
*/
|
||||
|
@ -703,8 +630,8 @@ class Crypt_DES extends Crypt_Base
|
|||
/**
|
||||
* Encrypts a block
|
||||
*
|
||||
* @see Crypt_Base::_encryptBlock()
|
||||
* @see Crypt_Base::encrypt()
|
||||
* @see \phpseclib\Crypt\Base::_encryptBlock()
|
||||
* @see \phpseclib\Crypt\Base::encrypt()
|
||||
* @see self::encrypt()
|
||||
* @access private
|
||||
* @param string $in
|
||||
|
@ -712,14 +639,14 @@ class Crypt_DES extends Crypt_Base
|
|||
*/
|
||||
function _encryptBlock($in)
|
||||
{
|
||||
return $this->_processBlock($in, CRYPT_DES_ENCRYPT);
|
||||
return $this->_processBlock($in, self::ENCRYPT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrypts a block
|
||||
*
|
||||
* @see Crypt_Base::_decryptBlock()
|
||||
* @see Crypt_Base::decrypt()
|
||||
* @see \phpseclib\Crypt\Base::_decryptBlock()
|
||||
* @see \phpseclib\Crypt\Base::decrypt()
|
||||
* @see self::decrypt()
|
||||
* @access private
|
||||
* @param string $in
|
||||
|
@ -727,13 +654,13 @@ class Crypt_DES extends Crypt_Base
|
|||
*/
|
||||
function _decryptBlock($in)
|
||||
{
|
||||
return $this->_processBlock($in, CRYPT_DES_DECRYPT);
|
||||
return $this->_processBlock($in, self::DECRYPT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encrypts or decrypts a 64-bit block
|
||||
*
|
||||
* $mode should be either CRYPT_DES_ENCRYPT or CRYPT_DES_DECRYPT. See
|
||||
* $mode should be either self::ENCRYPT or self::DECRYPT. See
|
||||
* {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general
|
||||
* idea of what this function does.
|
||||
*
|
||||
|
@ -822,7 +749,7 @@ class Crypt_DES extends Crypt_Base
|
|||
/**
|
||||
* Creates the key schedule
|
||||
*
|
||||
* @see Crypt_Base::_setupKey()
|
||||
* @see \phpseclib\Crypt\Base::_setupKey()
|
||||
* @access private
|
||||
*/
|
||||
function _setupKey()
|
||||
|
@ -1303,8 +1230,8 @@ class Crypt_DES extends Crypt_Base
|
|||
$d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F);
|
||||
|
||||
$keys[$des_round] = array(
|
||||
CRYPT_DES_ENCRYPT => array(),
|
||||
CRYPT_DES_DECRYPT => array_fill(0, 32, 0)
|
||||
self::ENCRYPT => array(),
|
||||
self::DECRYPT => array_fill(0, 32, 0)
|
||||
);
|
||||
for ($i = 0, $ki = 31; $i < 16; ++$i, $ki-= 2) {
|
||||
$c <<= $shifts[$i];
|
||||
|
@ -1323,33 +1250,33 @@ class Crypt_DES extends Crypt_Base
|
|||
(($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF);
|
||||
$val2 = (($cp << 8) & 0xFF000000) | (($cp << 16) & 0x00FF0000) |
|
||||
(($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF);
|
||||
$keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val1;
|
||||
$keys[$des_round][CRYPT_DES_DECRYPT][$ki - 1] = $val1;
|
||||
$keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val2;
|
||||
$keys[$des_round][CRYPT_DES_DECRYPT][$ki ] = $val2;
|
||||
$keys[$des_round][self::ENCRYPT][ ] = $val1;
|
||||
$keys[$des_round][self::DECRYPT][$ki - 1] = $val1;
|
||||
$keys[$des_round][self::ENCRYPT][ ] = $val2;
|
||||
$keys[$des_round][self::DECRYPT][$ki ] = $val2;
|
||||
}
|
||||
}
|
||||
|
||||
switch ($this->des_rounds) {
|
||||
case 3: // 3DES keys
|
||||
$this->keys = array(
|
||||
CRYPT_DES_ENCRYPT => array_merge(
|
||||
$keys[0][CRYPT_DES_ENCRYPT],
|
||||
$keys[1][CRYPT_DES_DECRYPT],
|
||||
$keys[2][CRYPT_DES_ENCRYPT]
|
||||
self::ENCRYPT => array_merge(
|
||||
$keys[0][self::ENCRYPT],
|
||||
$keys[1][self::DECRYPT],
|
||||
$keys[2][self::ENCRYPT]
|
||||
),
|
||||
CRYPT_DES_DECRYPT => array_merge(
|
||||
$keys[2][CRYPT_DES_DECRYPT],
|
||||
$keys[1][CRYPT_DES_ENCRYPT],
|
||||
$keys[0][CRYPT_DES_DECRYPT]
|
||||
self::DECRYPT => array_merge(
|
||||
$keys[2][self::DECRYPT],
|
||||
$keys[1][self::ENCRYPT],
|
||||
$keys[0][self::DECRYPT]
|
||||
)
|
||||
);
|
||||
break;
|
||||
// case 1: // DES keys
|
||||
default:
|
||||
$this->keys = array(
|
||||
CRYPT_DES_ENCRYPT => $keys[0][CRYPT_DES_ENCRYPT],
|
||||
CRYPT_DES_DECRYPT => $keys[0][CRYPT_DES_DECRYPT]
|
||||
self::ENCRYPT => $keys[0][self::ENCRYPT],
|
||||
self::DECRYPT => $keys[0][self::DECRYPT]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1357,12 +1284,12 @@ class Crypt_DES extends Crypt_Base
|
|||
/**
|
||||
* Setup the performance-optimized function for de/encrypt()
|
||||
*
|
||||
* @see Crypt_Base::_setupInlineCrypt()
|
||||
* @see \phpseclib\Crypt\Base::_setupInlineCrypt()
|
||||
* @access private
|
||||
*/
|
||||
function _setupInlineCrypt()
|
||||
{
|
||||
$lambda_functions =& Crypt_DES::_getLambdaFunctions();
|
||||
$lambda_functions =& self::_getLambdaFunctions();
|
||||
|
||||
// Engine configuration for:
|
||||
// - DES ($des_rounds == 1) or
|
||||
|
@ -1370,12 +1297,12 @@ class Crypt_DES extends Crypt_Base
|
|||
$des_rounds = $this->des_rounds;
|
||||
|
||||
// We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
|
||||
// (Currently, for Crypt_DES, one generated $lambda_function cost on php5.5@32bit ~135kb unfreeable mem and ~230kb on php5.5@64bit)
|
||||
// (Currently, for Crypt_TripleDES, one generated $lambda_function cost on php5.5@32bit ~240kb unfreeable mem and ~340kb on php5.5@64bit)
|
||||
// (Currently, for DES, one generated $lambda_function cost on php5.5@32bit ~135kb unfreeable mem and ~230kb on php5.5@64bit)
|
||||
// (Currently, for TripleDES, one generated $lambda_function cost on php5.5@32bit ~240kb unfreeable mem and ~340kb on php5.5@64bit)
|
||||
// After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one
|
||||
$gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
|
||||
|
||||
// Generation of a uniqe hash for our generated code
|
||||
// Generation of a unique hash for our generated code
|
||||
$code_hash = "Crypt_DES, $des_rounds, {$this->mode}";
|
||||
if ($gen_hi_opt_code) {
|
||||
// For hi-optimized code, we create for each combination of
|
||||
|
@ -1413,8 +1340,8 @@ class Crypt_DES extends Crypt_Base
|
|||
// No futher initialisation of the $keys schedule is necessary.
|
||||
// That is the extra performance boost.
|
||||
$k = array(
|
||||
CRYPT_DES_ENCRYPT => $this->keys[CRYPT_DES_ENCRYPT],
|
||||
CRYPT_DES_DECRYPT => $this->keys[CRYPT_DES_DECRYPT]
|
||||
self::ENCRYPT => $this->keys[self::ENCRYPT],
|
||||
self::DECRYPT => $this->keys[self::DECRYPT]
|
||||
);
|
||||
$init_encrypt = '';
|
||||
$init_decrypt = '';
|
||||
|
@ -1423,21 +1350,21 @@ class Crypt_DES extends Crypt_Base
|
|||
// In generic optimized code mode, we have to use, as the best compromise [currently],
|
||||
// our key schedule as $ke/$kd arrays. (with hardcoded indexes...)
|
||||
$k = array(
|
||||
CRYPT_DES_ENCRYPT => array(),
|
||||
CRYPT_DES_DECRYPT => array()
|
||||
self::ENCRYPT => array(),
|
||||
self::DECRYPT => array()
|
||||
);
|
||||
for ($i = 0, $c = count($this->keys[CRYPT_DES_ENCRYPT]); $i < $c; ++$i) {
|
||||
$k[CRYPT_DES_ENCRYPT][$i] = '$ke[' . $i . ']';
|
||||
$k[CRYPT_DES_DECRYPT][$i] = '$kd[' . $i . ']';
|
||||
for ($i = 0, $c = count($this->keys[self::ENCRYPT]); $i < $c; ++$i) {
|
||||
$k[self::ENCRYPT][$i] = '$ke[' . $i . ']';
|
||||
$k[self::DECRYPT][$i] = '$kd[' . $i . ']';
|
||||
}
|
||||
$init_encrypt = '$ke = $self->keys[CRYPT_DES_ENCRYPT];';
|
||||
$init_decrypt = '$kd = $self->keys[CRYPT_DES_DECRYPT];';
|
||||
$init_encrypt = '$ke = $self->keys[self::ENCRYPT];';
|
||||
$init_decrypt = '$kd = $self->keys[self::DECRYPT];';
|
||||
break;
|
||||
}
|
||||
|
||||
// Creating code for en- and decryption.
|
||||
$crypt_block = array();
|
||||
foreach (array(CRYPT_DES_ENCRYPT, CRYPT_DES_DECRYPT) as $c) {
|
||||
foreach (array(self::ENCRYPT, self::DECRYPT) as $c) {
|
||||
/* Do the initial IP permutation. */
|
||||
$crypt_block[$c] = '
|
||||
$in = unpack("N*", $in);
|
||||
|
@ -1504,8 +1431,8 @@ class Crypt_DES extends Crypt_Base
|
|||
'init_crypt' => $init_crypt,
|
||||
'init_encrypt' => $init_encrypt,
|
||||
'init_decrypt' => $init_decrypt,
|
||||
'encrypt_block' => $crypt_block[CRYPT_DES_ENCRYPT],
|
||||
'decrypt_block' => $crypt_block[CRYPT_DES_DECRYPT]
|
||||
'encrypt_block' => $crypt_block[self::ENCRYPT],
|
||||
'decrypt_block' => $crypt_block[self::DECRYPT]
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* If {@link self::setKey() setKey()} is called, {@link self::hash() hash()} will return the HMAC as opposed to
|
||||
* the hash. If no valid algorithm is provided, sha1 will be used.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* {@internal The variable names are the same as those in
|
||||
* {@link http://tools.ietf.org/html/rfc2104#section-2 RFC2104}.}}
|
||||
|
@ -18,9 +18,9 @@
|
|||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/Hash.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $hash = new Crypt_Hash('sha1');
|
||||
* $hash = new \phpseclib\Crypt\Hash('sha1');
|
||||
*
|
||||
* $hash->setKey('abcdefg');
|
||||
*
|
||||
|
@ -28,59 +28,45 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_Hash
|
||||
* @package Hash
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2007 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see self::Crypt_Hash()
|
||||
*/
|
||||
/**
|
||||
* Toggles the internal implementation
|
||||
*/
|
||||
define('CRYPT_HASH_MODE_INTERNAL', 1);
|
||||
/**
|
||||
* Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+.
|
||||
*/
|
||||
define('CRYPT_HASH_MODE_MHASH', 2);
|
||||
/**
|
||||
* Toggles the hash() implementation, which works on PHP 5.1.2+.
|
||||
*/
|
||||
define('CRYPT_HASH_MODE_HASH', 3);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
use phpseclib\Math\BigInteger;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions.
|
||||
*
|
||||
* @package Crypt_Hash
|
||||
* @package Hash
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Crypt_Hash
|
||||
class Hash
|
||||
{
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see \phpseclib\Crypt\Hash::__construct()
|
||||
*/
|
||||
/**
|
||||
* Toggles the internal implementation
|
||||
*/
|
||||
const MODE_INTERNAL = 1;
|
||||
/**
|
||||
* Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+.
|
||||
*/
|
||||
const MODE_MHASH = 2;
|
||||
/**
|
||||
* Toggles the hash() implementation, which works on PHP 5.1.2+.
|
||||
*/
|
||||
const MODE_HASH = 3;
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Hash Parameter
|
||||
*
|
||||
|
@ -148,21 +134,21 @@ class Crypt_Hash
|
|||
* Default Constructor.
|
||||
*
|
||||
* @param string $hash
|
||||
* @return Crypt_Hash
|
||||
* @return \phpseclib\Crypt\Hash
|
||||
* @access public
|
||||
*/
|
||||
function Crypt_Hash($hash = 'sha1')
|
||||
function __construct($hash = 'sha1')
|
||||
{
|
||||
if (!defined('CRYPT_HASH_MODE')) {
|
||||
switch (true) {
|
||||
case extension_loaded('hash'):
|
||||
define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH);
|
||||
define('CRYPT_HASH_MODE', self::MODE_HASH);
|
||||
break;
|
||||
case extension_loaded('mhash'):
|
||||
define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH);
|
||||
define('CRYPT_HASH_MODE', self::MODE_MHASH);
|
||||
break;
|
||||
default:
|
||||
define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL);
|
||||
define('CRYPT_HASH_MODE', self::MODE_INTERNAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -231,19 +217,19 @@ class Crypt_Hash
|
|||
|
||||
switch ($hash) {
|
||||
case 'md2':
|
||||
$mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ?
|
||||
CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL;
|
||||
$mode = CRYPT_HASH_MODE == self::MODE_HASH && in_array('md2', hash_algos()) ?
|
||||
self::MODE_HASH : self::MODE_INTERNAL;
|
||||
break;
|
||||
case 'sha384':
|
||||
case 'sha512':
|
||||
$mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE;
|
||||
$mode = CRYPT_HASH_MODE == self::MODE_MHASH ? self::MODE_INTERNAL : CRYPT_HASH_MODE;
|
||||
break;
|
||||
default:
|
||||
$mode = CRYPT_HASH_MODE;
|
||||
}
|
||||
|
||||
switch ($mode) {
|
||||
case CRYPT_HASH_MODE_MHASH:
|
||||
case self::MODE_MHASH:
|
||||
switch ($hash) {
|
||||
case 'md5':
|
||||
$this->hash = MHASH_MD5;
|
||||
|
@ -256,7 +242,7 @@ class Crypt_Hash
|
|||
$this->hash = MHASH_SHA1;
|
||||
}
|
||||
return;
|
||||
case CRYPT_HASH_MODE_HASH:
|
||||
case self::MODE_HASH:
|
||||
switch ($hash) {
|
||||
case 'md5':
|
||||
$this->hash = 'md5';
|
||||
|
@ -311,17 +297,17 @@ class Crypt_Hash
|
|||
*/
|
||||
function hash($text)
|
||||
{
|
||||
$mode = is_array($this->hash) ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE;
|
||||
$mode = is_array($this->hash) ? self::MODE_INTERNAL : CRYPT_HASH_MODE;
|
||||
|
||||
if (!empty($this->key) || is_string($this->key)) {
|
||||
switch ($mode) {
|
||||
case CRYPT_HASH_MODE_MHASH:
|
||||
case self::MODE_MHASH:
|
||||
$output = mhash($this->hash, $text, $this->key);
|
||||
break;
|
||||
case CRYPT_HASH_MODE_HASH:
|
||||
case self::MODE_HASH:
|
||||
$output = hash_hmac($this->hash, $text, $this->key, true);
|
||||
break;
|
||||
case CRYPT_HASH_MODE_INTERNAL:
|
||||
case self::MODE_INTERNAL:
|
||||
/* "Applications that use keys longer than B bytes will first hash the key using H and then use the
|
||||
resultant L byte string as the actual key to HMAC."
|
||||
|
||||
|
@ -338,13 +324,13 @@ class Crypt_Hash
|
|||
}
|
||||
} else {
|
||||
switch ($mode) {
|
||||
case CRYPT_HASH_MODE_MHASH:
|
||||
case self::MODE_MHASH:
|
||||
$output = mhash($this->hash, $text);
|
||||
break;
|
||||
case CRYPT_HASH_MODE_HASH:
|
||||
case self::MODE_HASH:
|
||||
$output = hash($this->hash, $text, true);
|
||||
break;
|
||||
case CRYPT_HASH_MODE_INTERNAL:
|
||||
case self::MODE_INTERNAL:
|
||||
$output = call_user_func($this->hash, $text);
|
||||
}
|
||||
}
|
||||
|
@ -520,7 +506,6 @@ class Crypt_Hash
|
|||
$this->_rightShift( $w[$i - 2], 10);
|
||||
// @codingStandardsIgnoreEnd
|
||||
$w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1);
|
||||
|
||||
}
|
||||
|
||||
// Initialize hash value for this chunk
|
||||
|
@ -578,10 +563,6 @@ class Crypt_Hash
|
|||
*/
|
||||
function _sha512($m)
|
||||
{
|
||||
if (!class_exists('Math_BigInteger')) {
|
||||
include_once 'Math/BigInteger.php';
|
||||
}
|
||||
|
||||
static $init384, $init512, $k;
|
||||
|
||||
if (!isset($k)) {
|
||||
|
@ -596,9 +577,9 @@ class Crypt_Hash
|
|||
);
|
||||
|
||||
for ($i = 0; $i < 8; $i++) {
|
||||
$init384[$i] = new Math_BigInteger($init384[$i], 16);
|
||||
$init384[$i] = new BigInteger($init384[$i], 16);
|
||||
$init384[$i]->setPrecision(64);
|
||||
$init512[$i] = new Math_BigInteger($init512[$i], 16);
|
||||
$init512[$i] = new BigInteger($init512[$i], 16);
|
||||
$init512[$i]->setPrecision(64);
|
||||
}
|
||||
|
||||
|
@ -628,7 +609,7 @@ class Crypt_Hash
|
|||
);
|
||||
|
||||
for ($i = 0; $i < 80; $i++) {
|
||||
$k[$i] = new Math_BigInteger($k[$i], 16);
|
||||
$k[$i] = new BigInteger($k[$i], 16);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -647,7 +628,7 @@ class Crypt_Hash
|
|||
foreach ($chunks as $chunk) {
|
||||
$w = array();
|
||||
for ($i = 0; $i < 16; $i++) {
|
||||
$temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256);
|
||||
$temp = new BigInteger($this->_string_shift($chunk, 8), 256);
|
||||
$temp->setPrecision(64);
|
||||
$w[] = $temp;
|
||||
}
|
||||
|
@ -743,7 +724,7 @@ class Crypt_Hash
|
|||
}
|
||||
|
||||
// Produce the final hash value (big-endian)
|
||||
// (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here)
|
||||
// (\phpseclib\Crypt\Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here)
|
||||
$temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() .
|
||||
$hash[4]->toBytes() . $hash[5]->toBytes();
|
||||
if ($this->l != 48) {
|
||||
|
@ -801,7 +782,7 @@ class Crypt_Hash
|
|||
* Add
|
||||
*
|
||||
* _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the
|
||||
* possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster.
|
||||
* possibility of overflow exists, care has to be taken. BigInteger could be used but this should be faster.
|
||||
*
|
||||
* @param int $...
|
||||
* @return int
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* Useful resources are as follows:
|
||||
*
|
||||
|
@ -14,9 +14,9 @@
|
|||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/RC2.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $rc2 = new Crypt_RC2();
|
||||
* $rc2 = new \phpseclib\Crypt\RC2();
|
||||
*
|
||||
* $rc2->setKey('abcdefgh');
|
||||
*
|
||||
|
@ -26,91 +26,27 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_RC2
|
||||
* @package RC2
|
||||
* @author Patrick Monnerat <pm@datasphere.ch>
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include Crypt_Base
|
||||
*
|
||||
* Base cipher class
|
||||
*/
|
||||
if (!class_exists('Crypt_Base')) {
|
||||
include_once 'Base.php';
|
||||
}
|
||||
|
||||
/**#@+
|
||||
* @access public
|
||||
* @see self::encrypt()
|
||||
* @see self::decrypt()
|
||||
*/
|
||||
/**
|
||||
* Encrypt / decrypt using the Counter mode.
|
||||
*
|
||||
* Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
|
||||
*/
|
||||
define('CRYPT_RC2_MODE_CTR', CRYPT_MODE_CTR);
|
||||
/**
|
||||
* Encrypt / decrypt using the Electronic Code Book mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
|
||||
*/
|
||||
define('CRYPT_RC2_MODE_ECB', CRYPT_MODE_ECB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Code Book Chaining mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
|
||||
*/
|
||||
define('CRYPT_RC2_MODE_CBC', CRYPT_MODE_CBC);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
|
||||
*/
|
||||
define('CRYPT_RC2_MODE_CFB', CRYPT_MODE_CFB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
|
||||
*/
|
||||
define('CRYPT_RC2_MODE_OFB', CRYPT_MODE_OFB);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of RC2.
|
||||
*
|
||||
* @package Crypt_RC2
|
||||
* @package RC2
|
||||
* @access public
|
||||
*/
|
||||
class Crypt_RC2 extends Crypt_Base
|
||||
class RC2 extends Base
|
||||
{
|
||||
/**
|
||||
* Block Length of the cipher
|
||||
*
|
||||
* @see Crypt_Base::block_size
|
||||
* @see \phpseclib\Crypt\Base::block_size
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
|
@ -119,7 +55,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* The Key
|
||||
*
|
||||
* @see Crypt_Base::key
|
||||
* @see \phpseclib\Crypt\Base::key
|
||||
* @see self::setKey()
|
||||
* @var string
|
||||
* @access private
|
||||
|
@ -129,7 +65,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* The Original (unpadded) Key
|
||||
*
|
||||
* @see Crypt_Base::key
|
||||
* @see \phpseclib\Crypt\Base::key
|
||||
* @see self::setKey()
|
||||
* @see self::encrypt()
|
||||
* @see self::decrypt()
|
||||
|
@ -141,7 +77,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* Don't truncate / null pad key
|
||||
*
|
||||
* @see Crypt_Base::_clearBuffers()
|
||||
* @see \phpseclib\Crypt\Base::_clearBuffers()
|
||||
* @var bool
|
||||
* @access private
|
||||
*/
|
||||
|
@ -150,25 +86,16 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* Key Length (in bytes)
|
||||
*
|
||||
* @see Crypt_RC2::setKeyLength()
|
||||
* @see \phpseclib\Crypt\RC2::setKeyLength()
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $key_length = 16; // = 128 bits
|
||||
|
||||
/**
|
||||
* The namespace used by the cipher for its constants.
|
||||
*
|
||||
* @see Crypt_Base::const_namespace
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $const_namespace = 'RC2';
|
||||
|
||||
/**
|
||||
* The mcrypt specific name of the cipher
|
||||
*
|
||||
* @see Crypt_Base::cipher_name_mcrypt
|
||||
* @see \phpseclib\Crypt\Base::cipher_name_mcrypt
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
|
@ -177,7 +104,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* Optimizing value while CFB-encrypting
|
||||
*
|
||||
* @see Crypt_Base::cfb_init_len
|
||||
* @see \phpseclib\Crypt\Base::cfb_init_len
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
|
@ -332,40 +259,12 @@ class Crypt_RC2 extends Crypt_Base
|
|||
0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6
|
||||
);
|
||||
|
||||
/**
|
||||
* Default Constructor.
|
||||
*
|
||||
* Determines whether or not the mcrypt extension should be used.
|
||||
*
|
||||
* $mode could be:
|
||||
*
|
||||
* - CRYPT_RC2_MODE_ECB
|
||||
*
|
||||
* - CRYPT_RC2_MODE_CBC
|
||||
*
|
||||
* - CRYPT_RC2_MODE_CTR
|
||||
*
|
||||
* - CRYPT_RC2_MODE_CFB
|
||||
*
|
||||
* - CRYPT_RC2_MODE_OFB
|
||||
*
|
||||
* If not explicitly set, CRYPT_RC2_MODE_CBC will be used.
|
||||
*
|
||||
* @see Crypt_Base::Crypt_Base()
|
||||
* @param int $mode
|
||||
* @access public
|
||||
*/
|
||||
function Crypt_RC2($mode = CRYPT_RC2_MODE_CBC)
|
||||
{
|
||||
parent::Crypt_Base($mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for engine validity
|
||||
*
|
||||
* This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
|
||||
* This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine()
|
||||
*
|
||||
* @see Crypt_Base::Crypt_Base()
|
||||
* @see \phpseclib\Crypt\Base::__construct()
|
||||
* @param int $engine
|
||||
* @access public
|
||||
* @return bool
|
||||
|
@ -373,7 +272,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
function isValidEngine($engine)
|
||||
{
|
||||
switch ($engine) {
|
||||
case CRYPT_ENGINE_OPENSSL:
|
||||
case self::ENGINE_OPENSSL:
|
||||
if ($this->current_key_length != 128 || strlen($this->orig_key) < 16) {
|
||||
return false;
|
||||
}
|
||||
|
@ -389,7 +288,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
*
|
||||
* Valid key lengths are 8 to 1024.
|
||||
* Calling this function after setting the key has no effect until the next
|
||||
* Crypt_RC2::setKey() call.
|
||||
* \phpseclib\Crypt\RC2::setKey() call.
|
||||
*
|
||||
* @access public
|
||||
* @param int $length in bits
|
||||
|
@ -430,7 +329,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
* If the key is not explicitly set, it'll be assumed to be a single
|
||||
* null byte.
|
||||
*
|
||||
* @see Crypt_Base::setKey()
|
||||
* @see \phpseclib\Crypt\Base::setKey()
|
||||
* @access public
|
||||
* @param string $key
|
||||
* @param int $t1 optional Effective key length in bits.
|
||||
|
@ -481,7 +380,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* Encrypts a message.
|
||||
*
|
||||
* Mostly a wrapper for Crypt_Base::encrypt, with some additional OpenSSL handling code
|
||||
* Mostly a wrapper for \phpseclib\Crypt\Base::encrypt, with some additional OpenSSL handling code
|
||||
*
|
||||
* @see self::decrypt()
|
||||
* @access public
|
||||
|
@ -490,7 +389,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
*/
|
||||
function encrypt($plaintext)
|
||||
{
|
||||
if ($this->engine == CRYPT_ENGINE_OPENSSL) {
|
||||
if ($this->engine == self::ENGINE_OPENSSL) {
|
||||
$temp = $this->key;
|
||||
$this->key = $this->orig_key;
|
||||
$result = parent::encrypt($plaintext);
|
||||
|
@ -504,7 +403,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* Decrypts a message.
|
||||
*
|
||||
* Mostly a wrapper for Crypt_Base::decrypt, with some additional OpenSSL handling code
|
||||
* Mostly a wrapper for \phpseclib\Crypt\Base::decrypt, with some additional OpenSSL handling code
|
||||
*
|
||||
* @see self::encrypt()
|
||||
* @access public
|
||||
|
@ -513,7 +412,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
*/
|
||||
function decrypt($ciphertext)
|
||||
{
|
||||
if ($this->engine == CRYPT_ENGINE_OPENSSL) {
|
||||
if ($this->engine == self::ENGINE_OPENSSL) {
|
||||
$temp = $this->key;
|
||||
$this->key = $this->orig_key;
|
||||
$result = parent::decrypt($ciphertext);
|
||||
|
@ -527,8 +426,8 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* Encrypts a block
|
||||
*
|
||||
* @see Crypt_Base::_encryptBlock()
|
||||
* @see Crypt_Base::encrypt()
|
||||
* @see \phpseclib\Crypt\Base::_encryptBlock()
|
||||
* @see \phpseclib\Crypt\Base::encrypt()
|
||||
* @access private
|
||||
* @param string $in
|
||||
* @return string
|
||||
|
@ -572,8 +471,8 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* Decrypts a block
|
||||
*
|
||||
* @see Crypt_Base::_decryptBlock()
|
||||
* @see Crypt_Base::decrypt()
|
||||
* @see \phpseclib\Crypt\Base::_decryptBlock()
|
||||
* @see \phpseclib\Crypt\Base::decrypt()
|
||||
* @access private
|
||||
* @param string $in
|
||||
* @return string
|
||||
|
@ -615,9 +514,9 @@ class Crypt_RC2 extends Crypt_Base
|
|||
}
|
||||
|
||||
/**
|
||||
* Setup the CRYPT_ENGINE_MCRYPT $engine
|
||||
* Setup the \phpseclib\Crypt\Base::ENGINE_MCRYPT $engine
|
||||
*
|
||||
* @see Crypt_Base::_setupMcrypt()
|
||||
* @see \phpseclib\Crypt\Base::_setupMcrypt()
|
||||
* @access private
|
||||
*/
|
||||
function _setupMcrypt()
|
||||
|
@ -632,7 +531,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* Creates the key schedule
|
||||
*
|
||||
* @see Crypt_Base::_setupKey()
|
||||
* @see \phpseclib\Crypt\Base::_setupKey()
|
||||
* @access private
|
||||
*/
|
||||
function _setupKey()
|
||||
|
@ -641,7 +540,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
$this->setKey('');
|
||||
}
|
||||
|
||||
// Key has already been expanded in Crypt_RC2::setKey():
|
||||
// Key has already been expanded in \phpseclib\Crypt\RC2::setKey():
|
||||
// Only the first value must be altered.
|
||||
$l = unpack('Ca/Cb/v*', $this->key);
|
||||
array_unshift($l, $this->pitable[$l['a']] | ($l['b'] << 8));
|
||||
|
@ -653,12 +552,12 @@ class Crypt_RC2 extends Crypt_Base
|
|||
/**
|
||||
* Setup the performance-optimized function for de/encrypt()
|
||||
*
|
||||
* @see Crypt_Base::_setupInlineCrypt()
|
||||
* @see \phpseclib\Crypt\Base::_setupInlineCrypt()
|
||||
* @access private
|
||||
*/
|
||||
function _setupInlineCrypt()
|
||||
{
|
||||
$lambda_functions = &Crypt_RC2::_getLambdaFunctions();
|
||||
$lambda_functions =& self::_getLambdaFunctions();
|
||||
|
||||
// The first 10 generated $lambda_functions will use the $keys hardcoded as integers
|
||||
// for the mixing rounds, for better inline crypt performance [~20% faster].
|
||||
|
@ -666,7 +565,7 @@ class Crypt_RC2 extends Crypt_Base
|
|||
// (Currently, for Crypt_RC2, one generated $lambda_function cost on php5.5@32bit ~60kb unfreeable mem and ~100kb on php5.5@64bit)
|
||||
$gen_hi_opt_code = (bool)(count($lambda_functions) < 10);
|
||||
|
||||
// Generation of a uniqe hash for our generated code
|
||||
// Generation of a unique hash for our generated code
|
||||
$code_hash = "Crypt_RC2, {$this->mode}";
|
||||
if ($gen_hi_opt_code) {
|
||||
$code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* Useful resources are as follows:
|
||||
*
|
||||
|
@ -18,9 +18,9 @@
|
|||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/RC4.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $rc4 = new Crypt_RC4();
|
||||
* $rc4 = new \phpseclib\Crypt\RC4();
|
||||
*
|
||||
* $rc4->setKey('abcdefgh');
|
||||
*
|
||||
|
@ -34,65 +34,40 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_RC4
|
||||
* @package RC4
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2007 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include Crypt_Base
|
||||
*
|
||||
* Base cipher class
|
||||
*/
|
||||
if (!class_exists('Crypt_Base')) {
|
||||
include_once 'Base.php';
|
||||
}
|
||||
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see self::_crypt()
|
||||
*/
|
||||
define('CRYPT_RC4_ENCRYPT', 0);
|
||||
define('CRYPT_RC4_DECRYPT', 1);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of RC4.
|
||||
*
|
||||
* @package Crypt_RC4
|
||||
* @package RC4
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Crypt_RC4 extends Crypt_Base
|
||||
class RC4 extends Base
|
||||
{
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see \phpseclib\Crypt\RC4::_crypt()
|
||||
*/
|
||||
const ENCRYPT = 0;
|
||||
const DECRYPT = 1;
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Block Length of the cipher
|
||||
*
|
||||
* RC4 is a stream cipher
|
||||
* so we the block_size to 0
|
||||
*
|
||||
* @see Crypt_Base::block_size
|
||||
* @see \phpseclib\Crypt\Base::block_size
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
|
@ -101,25 +76,16 @@ class Crypt_RC4 extends Crypt_Base
|
|||
/**
|
||||
* Key Length (in bytes)
|
||||
*
|
||||
* @see Crypt_RC4::setKeyLength()
|
||||
* @see \phpseclib\Crypt\RC4::setKeyLength()
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $key_length = 128; // = 1024 bits
|
||||
|
||||
/**
|
||||
* The namespace used by the cipher for its constants.
|
||||
*
|
||||
* @see Crypt_Base::const_namespace
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $const_namespace = 'RC4';
|
||||
|
||||
/**
|
||||
* The mcrypt specific name of the cipher
|
||||
*
|
||||
* @see Crypt_Base::cipher_name_mcrypt
|
||||
* @see \phpseclib\Crypt\Base::cipher_name_mcrypt
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
|
@ -128,7 +94,7 @@ class Crypt_RC4 extends Crypt_Base
|
|||
/**
|
||||
* Holds whether performance-optimized $inline_crypt() can/should be used.
|
||||
*
|
||||
* @see Crypt_Base::inline_crypt
|
||||
* @see \phpseclib\Crypt\Base::inline_crypt
|
||||
* @var mixed
|
||||
* @access private
|
||||
*/
|
||||
|
@ -157,29 +123,31 @@ class Crypt_RC4 extends Crypt_Base
|
|||
*
|
||||
* Determines whether or not the mcrypt extension should be used.
|
||||
*
|
||||
* @see Crypt_Base::Crypt_Base()
|
||||
* @return Crypt_RC4
|
||||
* @see \phpseclib\Crypt\Base::__construct()
|
||||
* @return \phpseclib\Crypt\RC4
|
||||
* @access public
|
||||
*/
|
||||
function Crypt_RC4()
|
||||
function __construct()
|
||||
{
|
||||
parent::Crypt_Base(CRYPT_MODE_STREAM);
|
||||
parent::__construct(Base::MODE_STREAM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for engine validity
|
||||
*
|
||||
* This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
|
||||
* This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine()
|
||||
*
|
||||
* @see Crypt_Base::Crypt_Base()
|
||||
* @see \phpseclib\Crypt\Base::__construct()
|
||||
* @param int $engine
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function isValidEngine($engine)
|
||||
{
|
||||
switch ($engine) {
|
||||
case CRYPT_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';
|
||||
|
@ -193,6 +161,7 @@ class Crypt_RC4 extends Crypt_Base
|
|||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return parent::isValidEngine($engine);
|
||||
|
@ -245,7 +214,7 @@ class Crypt_RC4 extends Crypt_Base
|
|||
/**
|
||||
* Encrypts a message.
|
||||
*
|
||||
* @see Crypt_Base::decrypt()
|
||||
* @see \phpseclib\Crypt\Base::decrypt()
|
||||
* @see self::_crypt()
|
||||
* @access public
|
||||
* @param string $plaintext
|
||||
|
@ -253,10 +222,10 @@ class Crypt_RC4 extends Crypt_Base
|
|||
*/
|
||||
function encrypt($plaintext)
|
||||
{
|
||||
if ($this->engine != CRYPT_ENGINE_INTERNAL) {
|
||||
if ($this->engine != Base::ENGINE_INTERNAL) {
|
||||
return parent::encrypt($plaintext);
|
||||
}
|
||||
return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT);
|
||||
return $this->_crypt($plaintext, self::ENCRYPT);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -265,7 +234,7 @@ class Crypt_RC4 extends Crypt_Base
|
|||
* $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)).
|
||||
* At least if the continuous buffer is disabled.
|
||||
*
|
||||
* @see Crypt_Base::encrypt()
|
||||
* @see \phpseclib\Crypt\Base::encrypt()
|
||||
* @see self::_crypt()
|
||||
* @access public
|
||||
* @param string $ciphertext
|
||||
|
@ -273,17 +242,38 @@ class Crypt_RC4 extends Crypt_Base
|
|||
*/
|
||||
function decrypt($ciphertext)
|
||||
{
|
||||
if ($this->engine != CRYPT_ENGINE_INTERNAL) {
|
||||
if ($this->engine != Base::ENGINE_INTERNAL) {
|
||||
return parent::decrypt($ciphertext);
|
||||
}
|
||||
return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT);
|
||||
return $this->_crypt($ciphertext, self::DECRYPT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encrypts a block
|
||||
*
|
||||
* @access private
|
||||
* @param string $in
|
||||
*/
|
||||
function _encryptBlock($in)
|
||||
{
|
||||
// RC4 does not utilize this method
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrypts a block
|
||||
*
|
||||
* @access private
|
||||
* @param string $in
|
||||
*/
|
||||
function _decryptBlock($in)
|
||||
{
|
||||
// RC4 does not utilize this method
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup the key (expansion)
|
||||
*
|
||||
* @see Crypt_Base::_setupKey()
|
||||
* @see \phpseclib\Crypt\Base::_setupKey()
|
||||
* @access private
|
||||
*/
|
||||
function _setupKey()
|
||||
|
@ -300,7 +290,7 @@ class Crypt_RC4 extends Crypt_Base
|
|||
}
|
||||
|
||||
$this->stream = array();
|
||||
$this->stream[CRYPT_RC4_DECRYPT] = $this->stream[CRYPT_RC4_ENCRYPT] = array(
|
||||
$this->stream[self::DECRYPT] = $this->stream[self::ENCRYPT] = array(
|
||||
0, // index $i
|
||||
0, // index $j
|
||||
$keyStream
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -3,57 +3,36 @@
|
|||
/**
|
||||
* Random Number Generator
|
||||
*
|
||||
* The idea behind this function is that it can be easily replaced with your own crypt_random_string()
|
||||
* function. eg. maybe you have a better source of entropy for creating the initial states or whatever.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/Random.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* echo bin2hex(crypt_random_string(8));
|
||||
* echo bin2hex(\phpseclib\Crypt\Random::string(8));
|
||||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_Random
|
||||
* @package Random
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2007 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
// laravel is a PHP framework that utilizes phpseclib. laravel workbenches may, independently,
|
||||
// have phpseclib as a requirement as well. if you're developing such a program you may encounter
|
||||
// a "Cannot redeclare crypt_random_string()" error.
|
||||
if (!function_exists('crypt_random_string')) {
|
||||
/**
|
||||
* "Is Windows" test
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
/**
|
||||
* Pure-PHP Random Number Generator
|
||||
*
|
||||
* @package Random
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Random
|
||||
{
|
||||
/**
|
||||
* Generate a random string.
|
||||
*
|
||||
|
@ -63,14 +42,27 @@ if (!function_exists('crypt_random_string')) {
|
|||
*
|
||||
* @param int $length
|
||||
* @return string
|
||||
* @access public
|
||||
*/
|
||||
function crypt_random_string($length)
|
||||
static function string($length)
|
||||
{
|
||||
if (CRYPT_RANDOM_IS_WINDOWS) {
|
||||
// method 1. prior to PHP 5.3, mcrypt_create_iv() would call rand() on windows
|
||||
if (extension_loaded('mcrypt') && version_compare(PHP_VERSION, '5.3.0', '>=')) {
|
||||
return mcrypt_create_iv($length);
|
||||
if (version_compare(PHP_VERSION, '7.0.0', '>=')) {
|
||||
try {
|
||||
return \random_bytes($length);
|
||||
} catch (\Throwable $e) {
|
||||
// If a sufficient source of randomness is unavailable, random_bytes() will throw an
|
||||
// object that implements the Throwable interface (Exception, TypeError, Error).
|
||||
// We don't actually need to do anything here. The string() method should just continue
|
||||
// as normal. Note, however, that if we don't have a sufficient source of randomness for
|
||||
// random_bytes(), most of the other calls here will fail too, so we'll end up using
|
||||
// the PHP implementation.
|
||||
}
|
||||
}
|
||||
|
||||
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
|
||||
// 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);
|
||||
}
|
||||
// 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
|
||||
|
@ -90,7 +82,7 @@ if (!function_exists('crypt_random_string')) {
|
|||
}
|
||||
} else {
|
||||
// method 1. the fastest
|
||||
if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.0', '>=')) {
|
||||
if (extension_loaded('openssl')) {
|
||||
return openssl_random_pseudo_bytes($length);
|
||||
}
|
||||
// method 2
|
||||
|
@ -109,7 +101,7 @@ if (!function_exists('crypt_random_string')) {
|
|||
// 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
|
||||
|
@ -193,44 +185,26 @@ if (!function_exists('crypt_random_string')) {
|
|||
//
|
||||
// http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives
|
||||
switch (true) {
|
||||
case phpseclib_resolve_include_path('Crypt/AES.php'):
|
||||
if (!class_exists('Crypt_AES')) {
|
||||
include_once 'AES.php';
|
||||
}
|
||||
$crypto = new Crypt_AES(CRYPT_AES_MODE_CTR);
|
||||
case class_exists('\phpseclib\Crypt\AES'):
|
||||
$crypto = new AES(Base::MODE_CTR);
|
||||
break;
|
||||
case phpseclib_resolve_include_path('Crypt/Twofish.php'):
|
||||
if (!class_exists('Crypt_Twofish')) {
|
||||
include_once 'Twofish.php';
|
||||
}
|
||||
$crypto = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR);
|
||||
case class_exists('\phpseclib\Crypt\Twofish'):
|
||||
$crypto = new Twofish(Base::MODE_CTR);
|
||||
break;
|
||||
case phpseclib_resolve_include_path('Crypt/Blowfish.php'):
|
||||
if (!class_exists('Crypt_Blowfish')) {
|
||||
include_once 'Blowfish.php';
|
||||
}
|
||||
$crypto = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR);
|
||||
case class_exists('\phpseclib\Crypt\Blowfish'):
|
||||
$crypto = new Blowfish(Base::MODE_CTR);
|
||||
break;
|
||||
case phpseclib_resolve_include_path('Crypt/TripleDES.php'):
|
||||
if (!class_exists('Crypt_TripleDES')) {
|
||||
include_once 'TripleDES.php';
|
||||
}
|
||||
$crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR);
|
||||
case class_exists('\phpseclib\Crypt\TripleDES'):
|
||||
$crypto = new TripleDES(Base::MODE_CTR);
|
||||
break;
|
||||
case phpseclib_resolve_include_path('Crypt/DES.php'):
|
||||
if (!class_exists('Crypt_DES')) {
|
||||
include_once 'DES.php';
|
||||
}
|
||||
$crypto = new Crypt_DES(CRYPT_DES_MODE_CTR);
|
||||
case class_exists('\phpseclib\Crypt\DES'):
|
||||
$crypto = new DES(Base::MODE_CTR);
|
||||
break;
|
||||
case phpseclib_resolve_include_path('Crypt/RC4.php'):
|
||||
if (!class_exists('Crypt_RC4')) {
|
||||
include_once 'RC4.php';
|
||||
}
|
||||
$crypto = new Crypt_RC4();
|
||||
case class_exists('\phpseclib\Crypt\RC4'):
|
||||
$crypto = new RC4();
|
||||
break;
|
||||
default:
|
||||
user_error('crypt_random_string requires at least one symmetric cipher be loaded');
|
||||
user_error(__CLASS__ . ' requires at least one symmetric cipher be loaded');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -294,41 +268,3 @@ if (!function_exists('phpseclib_safe_serialize')) {
|
|||
return serialize($safearr);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('phpseclib_resolve_include_path')) {
|
||||
/**
|
||||
* Resolve filename against the include path.
|
||||
*
|
||||
* Wrapper around stream_resolve_include_path() (which was introduced in
|
||||
* PHP 5.3.2) with fallback implementation for earlier PHP versions.
|
||||
*
|
||||
* @param string $filename
|
||||
* @return string|false
|
||||
* @access public
|
||||
*/
|
||||
function phpseclib_resolve_include_path($filename)
|
||||
{
|
||||
if (function_exists('stream_resolve_include_path')) {
|
||||
return stream_resolve_include_path($filename);
|
||||
}
|
||||
|
||||
// handle non-relative paths
|
||||
if (file_exists($filename)) {
|
||||
return realpath($filename);
|
||||
}
|
||||
|
||||
$paths = PATH_SEPARATOR == ':' ?
|
||||
preg_split('#(?<!phar):#', get_include_path()) :
|
||||
explode(PATH_SEPARATOR, get_include_path());
|
||||
foreach ($paths as $prefix) {
|
||||
// path's specified in include_path don't always end in /
|
||||
$ds = substr($prefix, -1) == DIRECTORY_SEPARATOR ? '' : DIRECTORY_SEPARATOR;
|
||||
$file = $prefix . $ds . $filename;
|
||||
if (file_exists($file)) {
|
||||
return realpath($file);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Uses mcrypt, if available/possible, and an internal implementation, otherwise.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* If {@link self::setBlockLength() setBlockLength()} isn't called, it'll be assumed to be 128 bits. If
|
||||
* {@link self::setKeyLength() setKeyLength()} isn't called, it'll be calculated from
|
||||
|
@ -28,9 +28,9 @@
|
|||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/Rijndael.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $rijndael = new Crypt_Rijndael();
|
||||
* $rijndael = new \phpseclib\Crypt\Rijndael();
|
||||
*
|
||||
* $rijndael->setKey('abcdefghijklmnop');
|
||||
*
|
||||
|
@ -44,108 +44,35 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_Rijndael
|
||||
* @package Rijndael
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2008 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include Crypt_Base
|
||||
*
|
||||
* Base cipher class
|
||||
*/
|
||||
if (!class_exists('Crypt_Base')) {
|
||||
include_once 'Base.php';
|
||||
}
|
||||
|
||||
/**#@+
|
||||
* @access public
|
||||
* @see self::encrypt()
|
||||
* @see self::decrypt()
|
||||
*/
|
||||
/**
|
||||
* Encrypt / decrypt using the Counter mode.
|
||||
*
|
||||
* Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
|
||||
*/
|
||||
define('CRYPT_RIJNDAEL_MODE_CTR', CRYPT_MODE_CTR);
|
||||
/**
|
||||
* Encrypt / decrypt using the Electronic Code Book mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
|
||||
*/
|
||||
define('CRYPT_RIJNDAEL_MODE_ECB', CRYPT_MODE_ECB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Code Book Chaining mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
|
||||
*/
|
||||
define('CRYPT_RIJNDAEL_MODE_CBC', CRYPT_MODE_CBC);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
|
||||
*/
|
||||
define('CRYPT_RIJNDAEL_MODE_CFB', CRYPT_MODE_CFB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
|
||||
*/
|
||||
define('CRYPT_RIJNDAEL_MODE_OFB', CRYPT_MODE_OFB);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of Rijndael.
|
||||
*
|
||||
* @package Crypt_Rijndael
|
||||
* @package Rijndael
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Crypt_Rijndael extends Crypt_Base
|
||||
class Rijndael extends Base
|
||||
{
|
||||
/**
|
||||
* The namespace used by the cipher for its constants.
|
||||
*
|
||||
* @see Crypt_Base::const_namespace
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $const_namespace = 'RIJNDAEL';
|
||||
|
||||
/**
|
||||
* The mcrypt specific name of the cipher
|
||||
*
|
||||
* Mcrypt is useable for 128/192/256-bit $block_size/$key_length. For 160/224 not.
|
||||
* Crypt_Rijndael determines automatically whether mcrypt is useable
|
||||
* \phpseclib\Crypt\Rijndael determines automatically whether mcrypt is useable
|
||||
* or not for the current $block_size/$key_length.
|
||||
* In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly.
|
||||
*
|
||||
* @see Crypt_Base::cipher_name_mcrypt
|
||||
* @see Crypt_Base::engine
|
||||
* @see \phpseclib\Crypt\Base::cipher_name_mcrypt
|
||||
* @see \phpseclib\Crypt\Base::engine
|
||||
* @see self::isValidEngine()
|
||||
* @var string
|
||||
* @access private
|
||||
|
@ -155,8 +82,8 @@ class Crypt_Rijndael extends Crypt_Base
|
|||
/**
|
||||
* The default salt used by setPassword()
|
||||
*
|
||||
* @see Crypt_Base::password_default_salt
|
||||
* @see Crypt_Base::setPassword()
|
||||
* @see \phpseclib\Crypt\Base::password_default_salt
|
||||
* @see \phpseclib\Crypt\Base::setPassword()
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
|
@ -242,76 +169,7 @@ class Crypt_Rijndael extends Crypt_Base
|
|||
var $kl;
|
||||
|
||||
/**
|
||||
* Default Constructor.
|
||||
*
|
||||
* Determines whether or not the mcrypt extension should be used.
|
||||
*
|
||||
* $mode could be:
|
||||
*
|
||||
* - CRYPT_RIJNDAEL_MODE_ECB
|
||||
*
|
||||
* - CRYPT_RIJNDAEL_MODE_CBC
|
||||
*
|
||||
* - CRYPT_RIJNDAEL_MODE_CTR
|
||||
*
|
||||
* - CRYPT_RIJNDAEL_MODE_CFB
|
||||
*
|
||||
* - CRYPT_RIJNDAEL_MODE_OFB
|
||||
*
|
||||
* If not explictly set, CRYPT_RIJNDAEL_MODE_CBC will be used.
|
||||
*
|
||||
* @see Crypt_Base::Crypt_Base()
|
||||
* @param int $mode
|
||||
* @access public
|
||||
*/
|
||||
function Crypt_Rijndael($mode = CRYPT_RIJNDAEL_MODE_CBC)
|
||||
{
|
||||
parent::Crypt_Base($mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the key.
|
||||
*
|
||||
* Keys can be of any length. Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and
|
||||
* whose length is a multiple of 32. If the key is less than 256-bits and the key length isn't set, we round the length
|
||||
* up to the closest valid key length, padding $key with null bytes. If the key is more than 256-bits, we trim the
|
||||
* excess bits.
|
||||
*
|
||||
* If the key is not explicitly set, it'll be assumed to be all null bytes.
|
||||
*
|
||||
* Note: 160/224-bit keys must explicitly set by setKeyLength(), otherwise they will be round/pad up to 192/256 bits.
|
||||
*
|
||||
* @see Crypt_Base:setKey()
|
||||
* @see self::setKeyLength()
|
||||
* @access public
|
||||
* @param string $key
|
||||
*/
|
||||
function setKey($key)
|
||||
{
|
||||
if (!$this->explicit_key_length) {
|
||||
$length = strlen($key);
|
||||
switch (true) {
|
||||
case $length <= 16:
|
||||
$this->key_size = 16;
|
||||
break;
|
||||
case $length <= 20:
|
||||
$this->key_size = 20;
|
||||
break;
|
||||
case $length <= 24:
|
||||
$this->key_size = 24;
|
||||
break;
|
||||
case $length <= 28:
|
||||
$this->key_size = 28;
|
||||
break;
|
||||
default:
|
||||
$this->key_size = 32;
|
||||
}
|
||||
}
|
||||
parent::setKey($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the key length
|
||||
* Sets the key length.
|
||||
*
|
||||
* Valid key lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to
|
||||
* 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount.
|
||||
|
@ -378,9 +236,9 @@ class Crypt_Rijndael extends Crypt_Base
|
|||
/**
|
||||
* Test for engine validity
|
||||
*
|
||||
* This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
|
||||
* This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine()
|
||||
*
|
||||
* @see Crypt_Base::Crypt_Base()
|
||||
* @see \phpseclib\Crypt\Base::__construct()
|
||||
* @param int $engine
|
||||
* @access public
|
||||
* @return bool
|
||||
|
@ -388,14 +246,14 @@ class Crypt_Rijndael extends Crypt_Base
|
|||
function isValidEngine($engine)
|
||||
{
|
||||
switch ($engine) {
|
||||
case CRYPT_ENGINE_OPENSSL:
|
||||
case self::ENGINE_OPENSSL:
|
||||
if ($this->block_size != 16) {
|
||||
return false;
|
||||
}
|
||||
$this->cipher_name_openssl_ecb = 'aes-' . ($this->key_length << 3) . '-ecb';
|
||||
$this->cipher_name_openssl = 'aes-' . ($this->key_length << 3) . '-' . $this->_openssl_translate_mode();
|
||||
break;
|
||||
case CRYPT_ENGINE_MCRYPT:
|
||||
case self::ENGINE_MCRYPT:
|
||||
$this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3);
|
||||
if ($this->key_length % 8) { // is it a 160/224-bit key?
|
||||
// mcrypt is not usable for them, only for 128/192/256-bit keys
|
||||
|
@ -600,7 +458,7 @@ class Crypt_Rijndael extends Crypt_Base
|
|||
/**
|
||||
* Setup the key (expansion)
|
||||
*
|
||||
* @see Crypt_Base::_setupKey()
|
||||
* @see \phpseclib\Crypt\Base::_setupKey()
|
||||
* @access private
|
||||
*/
|
||||
function _setupKey()
|
||||
|
@ -732,9 +590,9 @@ class Crypt_Rijndael extends Crypt_Base
|
|||
/**
|
||||
* Provides the mixColumns and sboxes tables
|
||||
*
|
||||
* @see Crypt_Rijndael:_encryptBlock()
|
||||
* @see Crypt_Rijndael:_setupInlineCrypt()
|
||||
* @see Crypt_Rijndael:_subWord()
|
||||
* @see self::_encryptBlock()
|
||||
* @see self::_setupInlineCrypt()
|
||||
* @see self::_subWord()
|
||||
* @access private
|
||||
* @return array &$tables
|
||||
*/
|
||||
|
@ -821,9 +679,9 @@ class Crypt_Rijndael extends Crypt_Base
|
|||
/**
|
||||
* Provides the inverse mixColumns and inverse sboxes tables
|
||||
*
|
||||
* @see Crypt_Rijndael:_decryptBlock()
|
||||
* @see Crypt_Rijndael:_setupInlineCrypt()
|
||||
* @see Crypt_Rijndael:_setupKey()
|
||||
* @see self::_decryptBlock()
|
||||
* @see self::_setupInlineCrypt()
|
||||
* @see self::_setupKey()
|
||||
* @access private
|
||||
* @return array &$tables
|
||||
*/
|
||||
|
@ -905,7 +763,7 @@ class Crypt_Rijndael extends Crypt_Base
|
|||
/**
|
||||
* Setup the performance-optimized function for de/encrypt()
|
||||
*
|
||||
* @see Crypt_Base::_setupInlineCrypt()
|
||||
* @see \phpseclib\Crypt\Base::_setupInlineCrypt()
|
||||
* @access private
|
||||
*/
|
||||
function _setupInlineCrypt()
|
||||
|
@ -914,7 +772,7 @@ class Crypt_Rijndael extends Crypt_Base
|
|||
// So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt().
|
||||
// However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible.
|
||||
|
||||
$lambda_functions =& Crypt_Rijndael::_getLambdaFunctions();
|
||||
$lambda_functions =& self::_getLambdaFunctions();
|
||||
|
||||
// We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
|
||||
// (Currently, for Crypt_Rijndael/AES, one generated $lambda_function cost on php5.5@32bit ~80kb unfreeable mem and ~130kb on php5.5@64bit)
|
||||
|
|
|
@ -5,14 +5,14 @@
|
|||
*
|
||||
* Uses mcrypt, if available, and an internal implementation, otherwise. Operates in the EDE3 mode (encrypt-decrypt-encrypt).
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/TripleDES.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $des = new Crypt_TripleDES();
|
||||
* $des = new \phpseclib\Crypt\TripleDES();
|
||||
*
|
||||
* $des->setKey('abcdefghijklmnopqrstuvwx');
|
||||
*
|
||||
|
@ -26,78 +26,43 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_TripleDES
|
||||
* @package TripleDES
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2007 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include Crypt_DES
|
||||
*/
|
||||
if (!class_exists('Crypt_DES')) {
|
||||
include_once 'DES.php';
|
||||
}
|
||||
|
||||
/**#@+
|
||||
* @access public
|
||||
* @see self::Crypt_TripleDES()
|
||||
*/
|
||||
/**
|
||||
* Encrypt / decrypt using inner chaining
|
||||
*
|
||||
* Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (CRYPT_DES_MODE_CBC3).
|
||||
*/
|
||||
define('CRYPT_MODE_3CBC', -2);
|
||||
/**
|
||||
* BC version of the above.
|
||||
*/
|
||||
define('CRYPT_DES_MODE_3CBC', -2);
|
||||
/**
|
||||
* Encrypt / decrypt using outer chaining
|
||||
*
|
||||
* Outer chaining is used by SSH-2 and when the mode is set to CRYPT_DES_MODE_CBC.
|
||||
*/
|
||||
define('CRYPT_MODE_CBC3', CRYPT_MODE_CBC);
|
||||
/**
|
||||
* BC version of the above.
|
||||
*/
|
||||
define('CRYPT_DES_MODE_CBC3', CRYPT_MODE_CBC3);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of Triple DES.
|
||||
*
|
||||
* @package Crypt_TripleDES
|
||||
* @package TripleDES
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Crypt_TripleDES extends Crypt_DES
|
||||
class TripleDES extends DES
|
||||
{
|
||||
/**
|
||||
* Encrypt / decrypt using inner chaining
|
||||
*
|
||||
* Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (self::MODE_CBC3).
|
||||
*/
|
||||
const MODE_3CBC = -2;
|
||||
|
||||
/**
|
||||
* Encrypt / decrypt using outer chaining
|
||||
*
|
||||
* Outer chaining is used by SSH-2 and when the mode is set to \phpseclib\Crypt\Base::MODE_CBC.
|
||||
*/
|
||||
const MODE_CBC3 = Base::MODE_CBC;
|
||||
|
||||
/**
|
||||
* Key Length (in bytes)
|
||||
*
|
||||
* @see Crypt_TripleDES::setKeyLength()
|
||||
* @see \phpseclib\Crypt\TripleDES::setKeyLength()
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
|
@ -106,28 +71,18 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
/**
|
||||
* The default salt used by setPassword()
|
||||
*
|
||||
* @see Crypt_Base::password_default_salt
|
||||
* @see Crypt_Base::setPassword()
|
||||
* @see \phpseclib\Crypt\Base::password_default_salt
|
||||
* @see \phpseclib\Crypt\Base::setPassword()
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $password_default_salt = 'phpseclib';
|
||||
|
||||
/**
|
||||
* The namespace used by the cipher for its constants.
|
||||
*
|
||||
* @see Crypt_DES::const_namespace
|
||||
* @see Crypt_Base::const_namespace
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $const_namespace = 'DES';
|
||||
|
||||
/**
|
||||
* The mcrypt specific name of the cipher
|
||||
*
|
||||
* @see Crypt_DES::cipher_name_mcrypt
|
||||
* @see Crypt_Base::cipher_name_mcrypt
|
||||
* @see \phpseclib\Crypt\DES::cipher_name_mcrypt
|
||||
* @see \phpseclib\Crypt\Base::cipher_name_mcrypt
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
|
@ -136,7 +91,7 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
/**
|
||||
* Optimizing value while CFB-encrypting
|
||||
*
|
||||
* @see Crypt_Base::cfb_init_len
|
||||
* @see \phpseclib\Crypt\Base::cfb_init_len
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
|
@ -146,14 +101,14 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
* max possible size of $key
|
||||
*
|
||||
* @see self::setKey()
|
||||
* @see Crypt_DES::setKey()
|
||||
* @see \phpseclib\Crypt\DES::setKey()
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $key_length_max = 24;
|
||||
|
||||
/**
|
||||
* Internal flag whether using CRYPT_DES_MODE_3CBC or not
|
||||
* Internal flag whether using self::MODE_3CBC or not
|
||||
*
|
||||
* @var bool
|
||||
* @access private
|
||||
|
@ -161,7 +116,7 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
var $mode_3cbc;
|
||||
|
||||
/**
|
||||
* The Crypt_DES objects
|
||||
* The \phpseclib\Crypt\DES objects
|
||||
*
|
||||
* Used only if $mode_3cbc === true
|
||||
*
|
||||
|
@ -177,65 +132,65 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
*
|
||||
* $mode could be:
|
||||
*
|
||||
* - CRYPT_DES_MODE_ECB
|
||||
* - \phpseclib\Crypt\Base::MODE_ECB
|
||||
*
|
||||
* - CRYPT_DES_MODE_CBC
|
||||
* - \phpseclib\Crypt\Base::MODE_CBC
|
||||
*
|
||||
* - CRYPT_DES_MODE_CTR
|
||||
* - \phpseclib\Crypt\Base::MODE_CTR
|
||||
*
|
||||
* - CRYPT_DES_MODE_CFB
|
||||
* - \phpseclib\Crypt\Base::MODE_CFB
|
||||
*
|
||||
* - CRYPT_DES_MODE_OFB
|
||||
* - \phpseclib\Crypt\Base::MODE_OFB
|
||||
*
|
||||
* - CRYPT_DES_MODE_3CBC
|
||||
* - \phpseclib\Crypt\TripleDES::MODE_3CBC
|
||||
*
|
||||
* If not explicitly set, CRYPT_DES_MODE_CBC will be used.
|
||||
* If not explicitly set, \phpseclib\Crypt\Base::MODE_CBC will be used.
|
||||
*
|
||||
* @see Crypt_DES::Crypt_DES()
|
||||
* @see Crypt_Base::Crypt_Base()
|
||||
* @see \phpseclib\Crypt\DES::__construct()
|
||||
* @see \phpseclib\Crypt\Base::__construct()
|
||||
* @param int $mode
|
||||
* @access public
|
||||
*/
|
||||
function Crypt_TripleDES($mode = CRYPT_MODE_CBC)
|
||||
function __construct($mode = Base::MODE_CBC)
|
||||
{
|
||||
switch ($mode) {
|
||||
// In case of CRYPT_DES_MODE_3CBC, we init as CRYPT_DES_MODE_CBC
|
||||
// In case of self::MODE_3CBC, we init as CRYPT_DES_MODE_CBC
|
||||
// and additional flag us internally as 3CBC
|
||||
case CRYPT_DES_MODE_3CBC:
|
||||
parent::Crypt_Base(CRYPT_MODE_CBC);
|
||||
case self::MODE_3CBC:
|
||||
parent::__construct(Base::MODE_CBC);
|
||||
$this->mode_3cbc = true;
|
||||
|
||||
// This three $des'es will do the 3CBC work (if $key > 64bits)
|
||||
$this->des = array(
|
||||
new Crypt_DES(CRYPT_MODE_CBC),
|
||||
new Crypt_DES(CRYPT_MODE_CBC),
|
||||
new Crypt_DES(CRYPT_MODE_CBC),
|
||||
new DES(Base::MODE_CBC),
|
||||
new DES(Base::MODE_CBC),
|
||||
new DES(Base::MODE_CBC),
|
||||
);
|
||||
|
||||
// we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects
|
||||
// we're going to be doing the padding, ourselves, so disable it in the \phpseclib\Crypt\DES objects
|
||||
$this->des[0]->disablePadding();
|
||||
$this->des[1]->disablePadding();
|
||||
$this->des[2]->disablePadding();
|
||||
break;
|
||||
// If not 3CBC, we init as usual
|
||||
default:
|
||||
parent::Crypt_Base($mode);
|
||||
parent::__construct($mode);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for engine validity
|
||||
*
|
||||
* This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
|
||||
* This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine()
|
||||
*
|
||||
* @see Crypt_Base::Crypt_Base()
|
||||
* @see \phpseclib\Crypt\Base::__construct()
|
||||
* @param int $engine
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
function isValidEngine($engine)
|
||||
{
|
||||
if ($engine == CRYPT_ENGINE_OPENSSL) {
|
||||
if ($engine == self::ENGINE_OPENSSL) {
|
||||
$this->cipher_name_openssl_ecb = 'des-ede3';
|
||||
$mode = $this->_openssl_translate_mode();
|
||||
$this->cipher_name_openssl = $mode == 'ecb' ? 'des-ede3' : 'des-ede3-' . $mode;
|
||||
|
@ -247,10 +202,10 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
/**
|
||||
* Sets the initialization vector. (optional)
|
||||
*
|
||||
* SetIV is not required when CRYPT_DES_MODE_ECB is being used. If not explicitly set, it'll be assumed
|
||||
* SetIV is not required when \phpseclib\Crypt\Base::MODE_ECB is being used. If not explicitly set, it'll be assumed
|
||||
* to be all zero's.
|
||||
*
|
||||
* @see Crypt_Base::setIV()
|
||||
* @see \phpseclib\Crypt\Base::setIV()
|
||||
* @access public
|
||||
* @param string $iv
|
||||
*/
|
||||
|
@ -269,7 +224,7 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
*
|
||||
* Valid key lengths are 64, 128 and 192
|
||||
*
|
||||
* @see Crypt_Base:setKeyLength()
|
||||
* @see \phpseclib\Crypt\Base:setKeyLength()
|
||||
* @access public
|
||||
* @param int $length
|
||||
*/
|
||||
|
@ -301,8 +256,8 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
* If the key is not explicitly set, it'll be assumed to be all null bytes.
|
||||
*
|
||||
* @access public
|
||||
* @see Crypt_DES::setKey()
|
||||
* @see Crypt_Base::setKey()
|
||||
* @see \phpseclib\Crypt\DES::setKey()
|
||||
* @see \phpseclib\Crypt\Base::setKey()
|
||||
* @param string $key
|
||||
*/
|
||||
function setKey($key)
|
||||
|
@ -318,7 +273,7 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
}
|
||||
parent::setKey($key);
|
||||
|
||||
// And in case of CRYPT_DES_MODE_3CBC:
|
||||
// And in case of self::MODE_3CBC:
|
||||
// if key <= 64bits we not need the 3 $des to work,
|
||||
// because we will then act as regular DES-CBC with just a <= 64bit key.
|
||||
// So only if the key > 64bits (> 8 bytes) we will call setKey() for the 3 $des.
|
||||
|
@ -332,7 +287,7 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
/**
|
||||
* Encrypts a message.
|
||||
*
|
||||
* @see Crypt_Base::encrypt()
|
||||
* @see \phpseclib\Crypt\Base::encrypt()
|
||||
* @access public
|
||||
* @param string $plaintext
|
||||
* @return string $cipertext
|
||||
|
@ -340,7 +295,7 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
function encrypt($plaintext)
|
||||
{
|
||||
// parent::en/decrypt() is able to do all the work for all modes and keylengths,
|
||||
// except for: CRYPT_MODE_3CBC (inner chaining CBC) with a key > 64bits
|
||||
// except for: self::MODE_3CBC (inner chaining CBC) with a key > 64bits
|
||||
|
||||
// if the key is smaller then 8, do what we'd normally do
|
||||
if ($this->mode_3cbc && strlen($this->key) > 8) {
|
||||
|
@ -359,7 +314,7 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
/**
|
||||
* Decrypts a message.
|
||||
*
|
||||
* @see Crypt_Base::decrypt()
|
||||
* @see \phpseclib\Crypt\Base::decrypt()
|
||||
* @access public
|
||||
* @param string $ciphertext
|
||||
* @return string $plaintext
|
||||
|
@ -410,12 +365,12 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
* outputs. The reason is due to the fact that the initialization vector's change after every encryption /
|
||||
* decryption round when the continuous buffer is enabled. When it's disabled, they remain constant.
|
||||
*
|
||||
* Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each
|
||||
* Put another way, when the continuous buffer is enabled, the state of the \phpseclib\Crypt\DES() object changes after each
|
||||
* encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that
|
||||
* continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them),
|
||||
* however, they are also less intuitive and more likely to cause you problems.
|
||||
*
|
||||
* @see Crypt_Base::enableContinuousBuffer()
|
||||
* @see \phpseclib\Crypt\Base::enableContinuousBuffer()
|
||||
* @see self::disableContinuousBuffer()
|
||||
* @access public
|
||||
*/
|
||||
|
@ -434,7 +389,7 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
*
|
||||
* The default behavior.
|
||||
*
|
||||
* @see Crypt_Base::disableContinuousBuffer()
|
||||
* @see \phpseclib\Crypt\Base::disableContinuousBuffer()
|
||||
* @see self::enableContinuousBuffer()
|
||||
* @access public
|
||||
*/
|
||||
|
@ -451,8 +406,8 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
/**
|
||||
* Creates the key schedule
|
||||
*
|
||||
* @see Crypt_DES::_setupKey()
|
||||
* @see Crypt_Base::_setupKey()
|
||||
* @see \phpseclib\Crypt\DES::_setupKey()
|
||||
* @see \phpseclib\Crypt\Base::_setupKey()
|
||||
* @access private
|
||||
*/
|
||||
function _setupKey()
|
||||
|
@ -486,8 +441,8 @@ class Crypt_TripleDES extends Crypt_DES
|
|||
/**
|
||||
* Sets the internal crypt engine
|
||||
*
|
||||
* @see Crypt_Base::Crypt_Base()
|
||||
* @see Crypt_Base::setPreferredEngine()
|
||||
* @see \phpseclib\Crypt\Base::__construct()
|
||||
* @see \phpseclib\Crypt\Base::setPreferredEngine()
|
||||
* @param int $engine
|
||||
* @access public
|
||||
* @return int
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* Useful resources are as follows:
|
||||
*
|
||||
|
@ -14,9 +14,9 @@
|
|||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Crypt/Twofish.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $twofish = new Crypt_Twofish();
|
||||
* $twofish = new \phpseclib\Crypt\Twofish();
|
||||
*
|
||||
* $twofish->setKey('12345678901234567890123456789012');
|
||||
*
|
||||
|
@ -26,26 +26,8 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Crypt
|
||||
* @package Crypt_Twofish
|
||||
* @package Twofish
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @author Hans-Juergen Petrich <petrich@tronic-media.com>
|
||||
* @copyright 2007 Jim Wigginton
|
||||
|
@ -53,77 +35,22 @@
|
|||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include Crypt_Base
|
||||
*
|
||||
* Base cipher class
|
||||
*/
|
||||
if (!class_exists('Crypt_Base')) {
|
||||
include_once 'Base.php';
|
||||
}
|
||||
|
||||
/**#@+
|
||||
* @access public
|
||||
* @see self::encrypt()
|
||||
* @see self::decrypt()
|
||||
*/
|
||||
/**
|
||||
* Encrypt / decrypt using the Counter mode.
|
||||
*
|
||||
* Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
|
||||
*/
|
||||
define('CRYPT_TWOFISH_MODE_CTR', CRYPT_MODE_CTR);
|
||||
/**
|
||||
* Encrypt / decrypt using the Electronic Code Book mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
|
||||
*/
|
||||
define('CRYPT_TWOFISH_MODE_ECB', CRYPT_MODE_ECB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Code Book Chaining mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
|
||||
*/
|
||||
define('CRYPT_TWOFISH_MODE_CBC', CRYPT_MODE_CBC);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
|
||||
*/
|
||||
define('CRYPT_TWOFISH_MODE_CFB', CRYPT_MODE_CFB);
|
||||
/**
|
||||
* Encrypt / decrypt using the Cipher Feedback mode.
|
||||
*
|
||||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
|
||||
*/
|
||||
define('CRYPT_TWOFISH_MODE_OFB', CRYPT_MODE_OFB);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Crypt;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of Twofish.
|
||||
*
|
||||
* @package Crypt_Twofish
|
||||
* @package Twofish
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @author Hans-Juergen Petrich <petrich@tronic-media.com>
|
||||
* @access public
|
||||
*/
|
||||
class Crypt_Twofish extends Crypt_Base
|
||||
class Twofish extends Base
|
||||
{
|
||||
/**
|
||||
* The namespace used by the cipher for its constants.
|
||||
*
|
||||
* @see Crypt_Base::const_namespace
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $const_namespace = 'TWOFISH';
|
||||
|
||||
/**
|
||||
* The mcrypt specific name of the cipher
|
||||
*
|
||||
* @see Crypt_Base::cipher_name_mcrypt
|
||||
* @see \phpseclib\Crypt\Base::cipher_name_mcrypt
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
|
@ -132,7 +59,7 @@ class Crypt_Twofish extends Crypt_Base
|
|||
/**
|
||||
* Optimizing value while CFB-encrypting
|
||||
*
|
||||
* @see Crypt_Base::cfb_init_len
|
||||
* @see \phpseclib\Crypt\Base::cfb_init_len
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
|
@ -468,7 +395,7 @@ class Crypt_Twofish extends Crypt_Base
|
|||
/**
|
||||
* Setup the key (expansion)
|
||||
*
|
||||
* @see Crypt_Base::_setupKey()
|
||||
* @see \phpseclib\Crypt\Base::_setupKey()
|
||||
* @access private
|
||||
*/
|
||||
function _setupKey()
|
||||
|
@ -735,18 +662,18 @@ class Crypt_Twofish extends Crypt_Base
|
|||
/**
|
||||
* Setup the performance-optimized function for de/encrypt()
|
||||
*
|
||||
* @see Crypt_Base::_setupInlineCrypt()
|
||||
* @see \phpseclib\Crypt\Base::_setupInlineCrypt()
|
||||
* @access private
|
||||
*/
|
||||
function _setupInlineCrypt()
|
||||
{
|
||||
$lambda_functions =& Crypt_Twofish::_getLambdaFunctions();
|
||||
$lambda_functions =& self::_getLambdaFunctions();
|
||||
|
||||
// Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one.
|
||||
// (Currently, for Crypt_Twofish, one generated $lambda_function cost on php5.5@32bit ~140kb unfreeable mem and ~240kb on php5.5@64bit)
|
||||
$gen_hi_opt_code = (bool)(count($lambda_functions) < 10);
|
||||
|
||||
// Generation of a uniqe hash for our generated code
|
||||
// Generation of a unique hash for our generated code
|
||||
$code_hash = "Crypt_Twofish, {$this->mode}";
|
||||
if ($gen_hi_opt_code) {
|
||||
$code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
|
||||
|
|
|
@ -3,47 +3,31 @@
|
|||
/**
|
||||
* Pure-PHP ANSI Decoder
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* If you call read() in Net_SSH2 you may get {@link http://en.wikipedia.org/wiki/ANSI_escape_code ANSI escape codes} back.
|
||||
* If you call read() in \phpseclib\Net\SSH2 you may get {@link http://en.wikipedia.org/wiki/ANSI_escape_code ANSI escape codes} back.
|
||||
* They'd look like chr(0x1B) . '[00m' or whatever (0x1B = ESC). They tell a
|
||||
* {@link http://en.wikipedia.org/wiki/Terminal_emulator terminal emulator} how to format the characters, what
|
||||
* color to display them in, etc. File_ANSI is a {@link http://en.wikipedia.org/wiki/VT100 VT100} terminal emulator.
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
* color to display them in, etc. \phpseclib\File\ANSI is a {@link http://en.wikipedia.org/wiki/VT100 VT100} terminal emulator.
|
||||
*
|
||||
* @category File
|
||||
* @package File_ANSI
|
||||
* @package ANSI
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2012 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
namespace phpseclib\File;
|
||||
|
||||
/**
|
||||
* Pure-PHP ANSI Decoder
|
||||
*
|
||||
* @package File_ANSI
|
||||
* @package ANSI
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class File_ANSI
|
||||
class ANSI
|
||||
{
|
||||
/**
|
||||
* Max Width
|
||||
|
@ -176,20 +160,20 @@ class File_ANSI
|
|||
/**
|
||||
* Default Constructor.
|
||||
*
|
||||
* @return File_ANSI
|
||||
* @return \phpseclib\File\ANSI
|
||||
* @access public
|
||||
*/
|
||||
function File_ANSI()
|
||||
function __construct()
|
||||
{
|
||||
$attr_cell = new stdClass();
|
||||
$attr_cell = new \stdClass();
|
||||
$attr_cell->bold = false;
|
||||
$attr_cell->underline = false;
|
||||
$attr_cell->blink = false;
|
||||
$attr_cell->background = 'black';
|
||||
$attr_cell->foreground = 'white';
|
||||
$attr_cell->reverse = false;
|
||||
$this->base_attr_cell = clone($attr_cell);
|
||||
$this->attr_cell = clone($attr_cell);
|
||||
$this->base_attr_cell = clone $attr_cell;
|
||||
$this->attr_cell = clone $attr_cell;
|
||||
|
||||
$this->setHistory(200);
|
||||
$this->setDimensions(80, 24);
|
||||
|
@ -330,7 +314,7 @@ class File_ANSI
|
|||
foreach ($mods as $mod) {
|
||||
switch ($mod) {
|
||||
case 0: // Turn off character attributes
|
||||
$attr_cell = clone($this->base_attr_cell);
|
||||
$attr_cell = clone $this->base_attr_cell;
|
||||
break;
|
||||
case 1: // Turn bold mode on
|
||||
$attr_cell->bold = true;
|
||||
|
@ -400,7 +384,7 @@ class File_ANSI
|
|||
case "\x08": // backspace
|
||||
if ($this->x) {
|
||||
$this->x--;
|
||||
$this->attrs[$this->y][$this->x] = clone($this->base_attr_cell);
|
||||
$this->attrs[$this->y][$this->x] = clone $this->base_attr_cell;
|
||||
$this->screen[$this->y] = substr_replace(
|
||||
$this->screen[$this->y],
|
||||
$source[$i],
|
||||
|
@ -419,7 +403,7 @@ class File_ANSI
|
|||
$this->ansi.= "\x1B";
|
||||
break;
|
||||
default:
|
||||
$this->attrs[$this->y][$this->x] = clone($this->attr_cell);
|
||||
$this->attrs[$this->y][$this->x] = clone $this->attr_cell;
|
||||
if ($this->x > strlen($this->screen[$this->y])) {
|
||||
$this->screen[$this->y] = str_repeat(' ', $this->x);
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
/**
|
||||
* Pure-PHP ASN.1 Parser
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category File
|
||||
* @package ASN1
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2012 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
namespace phpseclib\File\ASN1;
|
||||
|
||||
/**
|
||||
* ASN.1 Element
|
||||
*
|
||||
* Bypass normal encoding rules in phpseclib\File\ASN1::encodeDER()
|
||||
*
|
||||
* @package ASN1
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Element
|
||||
{
|
||||
/**
|
||||
* Raw element value
|
||||
*
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $element;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $encoded
|
||||
* @return \phpseclib\File\ASN1\Element
|
||||
* @access public
|
||||
*/
|
||||
function __construct($encoded)
|
||||
{
|
||||
$this->element = $encoded;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -3,90 +3,73 @@
|
|||
/**
|
||||
* Pure-PHP implementation of SCP.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* The API for this library is modeled after the API from PHP's {@link http://php.net/book.ftp FTP extension}.
|
||||
*
|
||||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'Net/SCP.php';
|
||||
* include 'Net/SSH2.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $ssh = new Net_SSH2('www.domain.tld');
|
||||
* $ssh = new \phpseclib\Net\SSH2('www.domain.tld');
|
||||
* if (!$ssh->login('username', 'password')) {
|
||||
* exit('bad login');
|
||||
* }
|
||||
* $scp = new \phpseclib\Net\SCP($ssh);
|
||||
*
|
||||
* $scp = new Net_SCP($ssh);
|
||||
* $scp->put('abcd', str_repeat('x', 1024*1024));
|
||||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Net
|
||||
* @package Net_SCP
|
||||
* @package SCP
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2010 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**#@+
|
||||
* @access public
|
||||
* @see self::put()
|
||||
*/
|
||||
/**
|
||||
* Reads data from a local file.
|
||||
*/
|
||||
define('NET_SCP_LOCAL_FILE', 1);
|
||||
/**
|
||||
* Reads data from a string.
|
||||
*/
|
||||
define('NET_SCP_STRING', 2);
|
||||
/**#@-*/
|
||||
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see self::_send()
|
||||
* @see self::_receive()
|
||||
*/
|
||||
/**
|
||||
* SSH1 is being used.
|
||||
*/
|
||||
define('NET_SCP_SSH1', 1);
|
||||
/**
|
||||
* SSH2 is being used.
|
||||
*/
|
||||
define('NET_SCP_SSH2', 2);
|
||||
/**#@-*/
|
||||
namespace phpseclib\Net;
|
||||
|
||||
/**
|
||||
* Pure-PHP implementations of SCP.
|
||||
*
|
||||
* @package Net_SCP
|
||||
* @package SCP
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Net_SCP
|
||||
class SCP
|
||||
{
|
||||
/**#@+
|
||||
* @access public
|
||||
* @see \phpseclib\Net\SCP::put()
|
||||
*/
|
||||
/**
|
||||
* Reads data from a local file.
|
||||
*/
|
||||
const SOURCE_LOCAL_FILE = 1;
|
||||
/**
|
||||
* Reads data from a string.
|
||||
*/
|
||||
const SOURCE_STRING = 2;
|
||||
/**#@-*/
|
||||
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see \phpseclib\Net\SCP::_send()
|
||||
* @see \phpseclib\Net\SCP::_receive()
|
||||
*/
|
||||
/**
|
||||
* SSH1 is being used.
|
||||
*/
|
||||
const MODE_SSH1 = 1;
|
||||
/**
|
||||
* SSH2 is being used.
|
||||
*/
|
||||
const MODE_SSH2 = 2;
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* SSH Object
|
||||
*
|
||||
|
@ -116,41 +99,32 @@ class Net_SCP
|
|||
*
|
||||
* Connects to an SSH server
|
||||
*
|
||||
* @param string $host
|
||||
* @param int $port
|
||||
* @param int $timeout
|
||||
* @return Net_SCP
|
||||
* @param \phpseclib\Net\SSH1|\phpseclib\Net\SSH2 $ssh
|
||||
* @return \phpseclib\Net\SCP
|
||||
* @access public
|
||||
*/
|
||||
function Net_SCP($ssh)
|
||||
function __construct($ssh)
|
||||
{
|
||||
if (!is_object($ssh)) {
|
||||
if ($ssh instanceof SSH2) {
|
||||
$this->mode = self::MODE_SSH2;
|
||||
} elseif ($ssh instanceof SSH1) {
|
||||
$this->packet_size = 50000;
|
||||
$this->mode = self::MODE_SSH1;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (strtolower(get_class($ssh))) {
|
||||
case 'net_ssh2':
|
||||
$this->mode = NET_SCP_SSH2;
|
||||
break;
|
||||
case 'net_ssh1':
|
||||
$this->packet_size = 50000;
|
||||
$this->mode = NET_SCP_SSH1;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
$this->ssh = $ssh;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uploads a file to the SCP server.
|
||||
*
|
||||
* By default, Net_SCP::put() does not read from the local filesystem. $data is dumped directly into $remote_file.
|
||||
* So, for example, if you set $data to 'filename.ext' and then do Net_SCP::get(), you will get a file, twelve bytes
|
||||
* By default, \phpseclib\Net\SCP::put() does not read from the local filesystem. $data is dumped directly into $remote_file.
|
||||
* So, for example, if you set $data to 'filename.ext' and then do \phpseclib\Net\SCP::get(), you will get a file, twelve bytes
|
||||
* long, containing 'filename.ext' as its contents.
|
||||
*
|
||||
* Setting $mode to NET_SCP_LOCAL_FILE will change the above behavior. With NET_SCP_LOCAL_FILE, $remote_file will
|
||||
* Setting $mode to self::SOURCE_LOCAL_FILE will change the above behavior. With self::SOURCE_LOCAL_FILE, $remote_file will
|
||||
* contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how
|
||||
* large $remote_file will be, as well.
|
||||
*
|
||||
|
@ -164,7 +138,7 @@ class Net_SCP
|
|||
* @return bool
|
||||
* @access public
|
||||
*/
|
||||
function put($remote_file, $data, $mode = NET_SCP_STRING, $callback = null)
|
||||
function put($remote_file, $data, $mode = self::SOURCE_STRING, $callback = null)
|
||||
{
|
||||
if (!isset($this->ssh)) {
|
||||
return false;
|
||||
|
@ -179,13 +153,13 @@ class Net_SCP
|
|||
return false;
|
||||
}
|
||||
|
||||
if ($this->mode == NET_SCP_SSH2) {
|
||||
$this->packet_size = $this->ssh->packet_size_client_to_server[NET_SSH2_CHANNEL_EXEC] - 4;
|
||||
if ($this->mode == self::MODE_SSH2) {
|
||||
$this->packet_size = $this->ssh->packet_size_client_to_server[SSH2::CHANNEL_EXEC] - 4;
|
||||
}
|
||||
|
||||
$remote_file = basename($remote_file);
|
||||
|
||||
if ($mode == NET_SCP_STRING) {
|
||||
if ($mode == self::SOURCE_STRING) {
|
||||
$size = strlen($data);
|
||||
} else {
|
||||
if (!is_file($data)) {
|
||||
|
@ -209,7 +183,7 @@ class Net_SCP
|
|||
|
||||
$sent = 0;
|
||||
while ($sent < $size) {
|
||||
$temp = $mode & NET_SCP_STRING ? substr($data, $sent, $this->packet_size) : fread($fp, $this->packet_size);
|
||||
$temp = $mode & self::SOURCE_STRING ? substr($data, $sent, $this->packet_size) : fread($fp, $this->packet_size);
|
||||
$this->_send($temp);
|
||||
$sent+= strlen($temp);
|
||||
|
||||
|
@ -219,7 +193,7 @@ class Net_SCP
|
|||
}
|
||||
$this->_close();
|
||||
|
||||
if ($mode != NET_SCP_STRING) {
|
||||
if ($mode != self::SOURCE_STRING) {
|
||||
fclose($fp);
|
||||
}
|
||||
|
||||
|
@ -297,10 +271,10 @@ class Net_SCP
|
|||
function _send($data)
|
||||
{
|
||||
switch ($this->mode) {
|
||||
case NET_SCP_SSH2:
|
||||
$this->ssh->_send_channel_packet(NET_SSH2_CHANNEL_EXEC, $data);
|
||||
case self::MODE_SSH2:
|
||||
$this->ssh->_send_channel_packet(SSH2::CHANNEL_EXEC, $data);
|
||||
break;
|
||||
case NET_SCP_SSH1:
|
||||
case self::MODE_SSH1:
|
||||
$data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($data), $data);
|
||||
$this->ssh->_send_binary_packet($data);
|
||||
}
|
||||
|
@ -315,18 +289,21 @@ class Net_SCP
|
|||
function _receive()
|
||||
{
|
||||
switch ($this->mode) {
|
||||
case NET_SCP_SSH2:
|
||||
return $this->ssh->_get_channel_packet(NET_SSH2_CHANNEL_EXEC, true);
|
||||
case NET_SCP_SSH1:
|
||||
case self::MODE_SSH2:
|
||||
return $this->ssh->_get_channel_packet(SSH2::CHANNEL_EXEC, true);
|
||||
case self::MODE_SSH1:
|
||||
if (!$this->ssh->bitmap) {
|
||||
return false;
|
||||
}
|
||||
while (true) {
|
||||
$response = $this->ssh->_get_binary_packet();
|
||||
switch ($response[NET_SSH1_RESPONSE_TYPE]) {
|
||||
switch ($response[SSH1::RESPONSE_TYPE]) {
|
||||
case NET_SSH1_SMSG_STDOUT_DATA:
|
||||
extract(unpack('Nlength', $response[NET_SSH1_RESPONSE_DATA]));
|
||||
return $this->ssh->_string_shift($response[NET_SSH1_RESPONSE_DATA], $length);
|
||||
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:
|
||||
break;
|
||||
case NET_SSH1_SMSG_EXITSTATUS:
|
||||
|
@ -350,10 +327,10 @@ class Net_SCP
|
|||
function _close()
|
||||
{
|
||||
switch ($this->mode) {
|
||||
case NET_SCP_SSH2:
|
||||
$this->ssh->_close_channel(NET_SSH2_CHANNEL_EXEC, true);
|
||||
case self::MODE_SSH2:
|
||||
$this->ssh->_close_channel(SSH2::CHANNEL_EXEC, true);
|
||||
break;
|
||||
case NET_SCP_SSH1:
|
||||
case self::MODE_SSH1:
|
||||
$this->ssh->disconnect();
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -7,40 +7,27 @@
|
|||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category Net
|
||||
* @package Net_SFTP_Stream
|
||||
* @package SFTP
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2013 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
namespace phpseclib\Net\SFTP;
|
||||
|
||||
use phpseclib\Crypt\RSA;
|
||||
use phpseclib\Net\SFTP;
|
||||
|
||||
/**
|
||||
* SFTP Stream Wrapper
|
||||
*
|
||||
* @package Net_SFTP_Stream
|
||||
* @package SFTP
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access public
|
||||
*/
|
||||
class Net_SFTP_Stream
|
||||
class Stream
|
||||
{
|
||||
/**
|
||||
* SFTP instances
|
||||
|
@ -137,8 +124,7 @@ class Net_SFTP_Stream
|
|||
if (in_array($protocol, stream_get_wrappers(), true)) {
|
||||
return false;
|
||||
}
|
||||
$class = function_exists('get_called_class') ? get_called_class() : __CLASS__;
|
||||
return stream_wrapper_register($protocol, $class);
|
||||
return stream_wrapper_register($protocol, get_called_class());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -146,15 +132,11 @@ class Net_SFTP_Stream
|
|||
*
|
||||
* @access public
|
||||
*/
|
||||
function Net_SFTP_Stream()
|
||||
function __construct()
|
||||
{
|
||||
if (defined('NET_SFTP_STREAM_LOGGING')) {
|
||||
echo "__construct()\r\n";
|
||||
}
|
||||
|
||||
if (!class_exists('Net_SFTP')) {
|
||||
include_once 'Net/SFTP.php';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -198,7 +180,7 @@ class Net_SFTP_Stream
|
|||
if ($host[0] == '$') {
|
||||
$host = substr($host, 1);
|
||||
global $$host;
|
||||
if (!is_object($$host) || get_class($$host) != 'Net_SFTP') {
|
||||
if (($$host instanceof SFTP) === false) {
|
||||
return false;
|
||||
}
|
||||
$this->sftp = $$host;
|
||||
|
@ -212,7 +194,7 @@ class Net_SFTP_Stream
|
|||
if (isset($context[$scheme]['sftp'])) {
|
||||
$sftp = $context[$scheme]['sftp'];
|
||||
}
|
||||
if (isset($sftp) && is_object($sftp) && get_class($sftp) == 'Net_SFTP') {
|
||||
if (isset($sftp) && $sftp instanceof SFTP) {
|
||||
$this->sftp = $sftp;
|
||||
return $path;
|
||||
}
|
||||
|
@ -222,7 +204,7 @@ class Net_SFTP_Stream
|
|||
if (isset($context[$scheme]['password'])) {
|
||||
$pass = $context[$scheme]['password'];
|
||||
}
|
||||
if (isset($context[$scheme]['privkey']) && is_object($context[$scheme]['privkey']) && get_Class($context[$scheme]['privkey']) == 'Crypt_RSA') {
|
||||
if (isset($context[$scheme]['privkey']) && $context[$scheme]['privkey'] instanceof RSA) {
|
||||
$pass = $context[$scheme]['privkey'];
|
||||
}
|
||||
|
||||
|
@ -230,11 +212,11 @@ class Net_SFTP_Stream
|
|||
return false;
|
||||
}
|
||||
|
||||
// casting $pass to a string is necessary in the event that it's a Crypt_RSA object
|
||||
// casting $pass to a string is necessary in the event that it's a \phpseclib\Crypt\RSA object
|
||||
if (isset(self::$instances[$host][$port][$user][(string) $pass])) {
|
||||
$this->sftp = self::$instances[$host][$port][$user][(string) $pass];
|
||||
} else {
|
||||
$this->sftp = new Net_SFTP($host, $port);
|
||||
$this->sftp = new SFTP($host, $port);
|
||||
$this->sftp->disableStatCache();
|
||||
if (isset($this->notification) && is_callable($this->notification)) {
|
||||
/* if !is_callable($this->notification) we could do this:
|
||||
|
@ -366,7 +348,7 @@ class Net_SFTP_Stream
|
|||
return false;
|
||||
}
|
||||
|
||||
$result = $this->sftp->put($this->path, $data, NET_SFTP_STRING, $this->pos);
|
||||
$result = $this->sftp->put($this->path, $data, SFTP::SOURCE_STRING, $this->pos);
|
||||
if (isset($this->notification) && is_callable($this->notification)) {
|
||||
if (!$result) {
|
||||
call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0);
|
||||
|
@ -506,7 +488,7 @@ class Net_SFTP_Stream
|
|||
* Renames a file or directory
|
||||
*
|
||||
* Attempts to rename oldname to newname, moving it between directories if necessary.
|
||||
* If newname exists, it will be overwritten. This is a departure from what Net_SFTP
|
||||
* If newname exists, it will be overwritten. This is a departure from what \phpseclib\Net\SFTP
|
||||
* does.
|
||||
*
|
||||
* @param string $path_from
|
||||
|
@ -662,7 +644,7 @@ class Net_SFTP_Stream
|
|||
/**
|
||||
* Flushes the output
|
||||
*
|
||||
* See <http://php.net/fflush>. Always returns true because Net_SFTP doesn't cache stuff before writing
|
||||
* See <http://php.net/fflush>. Always returns true because \phpseclib\Net\SFTP doesn't cache stuff before writing
|
||||
*
|
||||
* @return bool
|
||||
* @access public
|
||||
|
@ -707,7 +689,7 @@ class Net_SFTP_Stream
|
|||
/**
|
||||
* Retrieve information about a file
|
||||
*
|
||||
* Ignores the STREAM_URL_STAT_QUIET flag because the entirety of Net_SFTP_Stream is quiet by default
|
||||
* Ignores the STREAM_URL_STAT_QUIET flag because the entirety of \phpseclib\Net\SFTP\Stream is quiet by default
|
||||
* might be worthwhile to reconstruct bits 12-16 (ie. the file type) if mode doesn't have them but we'll
|
||||
* cross that bridge when and if it's reached
|
||||
*
|
||||
|
@ -754,7 +736,7 @@ class Net_SFTP_Stream
|
|||
* Change stream options
|
||||
*
|
||||
* STREAM_OPTION_WRITE_BUFFER isn't supported for the same reason stream_flush isn't.
|
||||
* The other two aren't supported because of limitations in Net_SFTP.
|
||||
* The other two aren't supported because of limitations in \phpseclib\Net\SFTP.
|
||||
*
|
||||
* @param int $option
|
||||
* @param int $arg1
|
||||
|
@ -811,5 +793,3 @@ class Net_SFTP_Stream
|
|||
return call_user_func_array(array($this, $name), $arguments);
|
||||
}
|
||||
}
|
||||
|
||||
Net_SFTP_Stream::register();
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -3,17 +3,16 @@
|
|||
/**
|
||||
* Pure-PHP ssh-agent client.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
* PHP version 5
|
||||
*
|
||||
* Here are some examples of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include 'System/SSH/Agent.php';
|
||||
* include 'Net/SSH2.php';
|
||||
* include 'vendor/autoload.php';
|
||||
*
|
||||
* $agent = new System_SSH_Agent();
|
||||
* $agent = new \phpseclib\System\SSH\Agent();
|
||||
*
|
||||
* $ssh = new Net_SSH2('www.domain.tld');
|
||||
* $ssh = new \phpseclib\Net\SSH2('www.domain.tld');
|
||||
* if (!$ssh->login('username', $agent)) {
|
||||
* exit('Login Failed');
|
||||
* }
|
||||
|
@ -23,26 +22,8 @@
|
|||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category System
|
||||
* @package System_SSH_Agent
|
||||
* @package SSH\Agent
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2014 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
|
@ -50,188 +31,55 @@
|
|||
* @internal See http://api.libssh.org/rfc/PROTOCOL.agent
|
||||
*/
|
||||
|
||||
/**#@+
|
||||
* Message numbers
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
// to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1)
|
||||
define('SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES', 11);
|
||||
// this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2).
|
||||
define('SYSTEM_SSH_AGENT_IDENTITIES_ANSWER', 12);
|
||||
define('SYSTEM_SSH_AGENT_FAILURE', 5);
|
||||
// the SSH1 request is SSH_AGENTC_RSA_CHALLENGE (3)
|
||||
define('SYSTEM_SSH_AGENTC_SIGN_REQUEST', 13);
|
||||
// the SSH1 response is SSH_AGENT_RSA_RESPONSE (4)
|
||||
define('SYSTEM_SSH_AGENT_SIGN_RESPONSE', 14);
|
||||
namespace phpseclib\System\SSH;
|
||||
|
||||
|
||||
/**@+
|
||||
* Agent forwarding status
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
// no forwarding requested and not active
|
||||
define('SYSTEM_SSH_AGENT_FORWARD_NONE', 0);
|
||||
// request agent forwarding when opportune
|
||||
define('SYSTEM_SSH_AGENT_FORWARD_REQUEST', 1);
|
||||
// forwarding has been request and is active
|
||||
define('SYSTEM_SSH_AGENT_FORWARD_ACTIVE', 2);
|
||||
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Pure-PHP ssh-agent client identity object
|
||||
*
|
||||
* Instantiation should only be performed by System_SSH_Agent class.
|
||||
* This could be thought of as implementing an interface that Crypt_RSA
|
||||
* implements. ie. maybe a Net_SSH_Auth_PublicKey interface or something.
|
||||
* The methods in this interface would be getPublicKey, setSignatureMode
|
||||
* and sign since those are the methods phpseclib looks for to perform
|
||||
* public key authentication.
|
||||
*
|
||||
* @package System_SSH_Agent
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access internal
|
||||
*/
|
||||
class System_SSH_Agent_Identity
|
||||
{
|
||||
/**
|
||||
* Key Object
|
||||
*
|
||||
* @var Crypt_RSA
|
||||
* @access private
|
||||
* @see self::getPublicKey()
|
||||
*/
|
||||
var $key;
|
||||
|
||||
/**
|
||||
* Key Blob
|
||||
*
|
||||
* @var string
|
||||
* @access private
|
||||
* @see self::sign()
|
||||
*/
|
||||
var $key_blob;
|
||||
|
||||
/**
|
||||
* Socket Resource
|
||||
*
|
||||
* @var resource
|
||||
* @access private
|
||||
* @see self::sign()
|
||||
*/
|
||||
var $fsock;
|
||||
|
||||
/**
|
||||
* Default Constructor.
|
||||
*
|
||||
* @param resource $fsock
|
||||
* @return System_SSH_Agent_Identity
|
||||
* @access private
|
||||
*/
|
||||
function System_SSH_Agent_Identity($fsock)
|
||||
{
|
||||
$this->fsock = $fsock;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Public Key
|
||||
*
|
||||
* Called by System_SSH_Agent::requestIdentities()
|
||||
*
|
||||
* @param Crypt_RSA $key
|
||||
* @access private
|
||||
*/
|
||||
function setPublicKey($key)
|
||||
{
|
||||
$this->key = $key;
|
||||
$this->key->setPublicKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Public Key
|
||||
*
|
||||
* Called by System_SSH_Agent::requestIdentities(). The key blob could be extracted from $this->key
|
||||
* but this saves a small amount of computation.
|
||||
*
|
||||
* @param string $key_blob
|
||||
* @access private
|
||||
*/
|
||||
function setPublicKeyBlob($key_blob)
|
||||
{
|
||||
$this->key_blob = $key_blob;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Public Key
|
||||
*
|
||||
* Wrapper for $this->key->getPublicKey()
|
||||
*
|
||||
* @param int $format optional
|
||||
* @return mixed
|
||||
* @access public
|
||||
*/
|
||||
function getPublicKey($format = null)
|
||||
{
|
||||
return !isset($format) ? $this->key->getPublicKey() : $this->key->getPublicKey($format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Signature Mode
|
||||
*
|
||||
* Doesn't do anything as ssh-agent doesn't let you pick and choose the signature mode. ie.
|
||||
* ssh-agent's only supported mode is CRYPT_RSA_SIGNATURE_PKCS1
|
||||
*
|
||||
* @param int $mode
|
||||
* @access public
|
||||
*/
|
||||
function setSignatureMode($mode)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a signature
|
||||
*
|
||||
* See "2.6.2 Protocol 2 private key signature request"
|
||||
*
|
||||
* @param string $message
|
||||
* @return string
|
||||
* @access public
|
||||
*/
|
||||
function sign($message)
|
||||
{
|
||||
// the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE
|
||||
$packet = pack('CNa*Na*N', SYSTEM_SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, 0);
|
||||
$packet = pack('Na*', strlen($packet), $packet);
|
||||
if (strlen($packet) != fputs($this->fsock, $packet)) {
|
||||
user_error('Connection closed during signing');
|
||||
}
|
||||
|
||||
$length = current(unpack('N', fread($this->fsock, 4)));
|
||||
$type = ord(fread($this->fsock, 1));
|
||||
if ($type != SYSTEM_SSH_AGENT_SIGN_RESPONSE) {
|
||||
user_error('Unable to retreive signature');
|
||||
}
|
||||
|
||||
$signature_blob = fread($this->fsock, $length - 1);
|
||||
// the only other signature format defined - ssh-dss - is the same length as ssh-rsa
|
||||
// the + 12 is for the other various SSH added length fields
|
||||
return substr($signature_blob, strlen('ssh-rsa') + 12);
|
||||
}
|
||||
}
|
||||
use phpseclib\Crypt\RSA;
|
||||
use phpseclib\System\SSH\Agent\Identity;
|
||||
|
||||
/**
|
||||
* Pure-PHP ssh-agent client identity factory
|
||||
*
|
||||
* requestIdentities() method pumps out System_SSH_Agent_Identity objects
|
||||
* requestIdentities() method pumps out \phpseclib\System\SSH\Agent\Identity objects
|
||||
*
|
||||
* @package System_SSH_Agent
|
||||
* @package SSH\Agent
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access internal
|
||||
*/
|
||||
class System_SSH_Agent
|
||||
class Agent
|
||||
{
|
||||
/**#@+
|
||||
* Message numbers
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
// to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1)
|
||||
const SSH_AGENTC_REQUEST_IDENTITIES = 11;
|
||||
// this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2).
|
||||
const SSH_AGENT_IDENTITIES_ANSWER = 12;
|
||||
// the SSH1 request is SSH_AGENTC_RSA_CHALLENGE (3)
|
||||
const SSH_AGENTC_SIGN_REQUEST = 13;
|
||||
// the SSH1 response is SSH_AGENT_RSA_RESPONSE (4)
|
||||
const SSH_AGENT_SIGN_RESPONSE = 14;
|
||||
/**#@-*/
|
||||
|
||||
/**@+
|
||||
* Agent forwarding status
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
// no forwarding requested and not active
|
||||
const FORWARD_NONE = 0;
|
||||
// request agent forwarding when opportune
|
||||
const FORWARD_REQUEST = 1;
|
||||
// forwarding has been request and is active
|
||||
const FORWARD_ACTIVE = 2;
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Unused
|
||||
*/
|
||||
const SSH_AGENT_FAILURE = 5;
|
||||
|
||||
/**
|
||||
* Socket Resource
|
||||
*
|
||||
|
@ -245,7 +93,7 @@ class System_SSH_Agent
|
|||
*
|
||||
* @access private
|
||||
*/
|
||||
var $forward_status = SYSTEM_SSH_AGENT_FORWARD_NONE;
|
||||
var $forward_status = self::FORWARD_NONE;
|
||||
|
||||
/**
|
||||
* Buffer for accumulating forwarded authentication
|
||||
|
@ -266,10 +114,10 @@ class System_SSH_Agent
|
|||
/**
|
||||
* Default Constructor
|
||||
*
|
||||
* @return System_SSH_Agent
|
||||
* @return \phpseclib\System\SSH\Agent
|
||||
* @access public
|
||||
*/
|
||||
function System_SSH_Agent()
|
||||
function __construct()
|
||||
{
|
||||
switch (true) {
|
||||
case isset($_SERVER['SSH_AUTH_SOCK']):
|
||||
|
@ -293,7 +141,7 @@ class System_SSH_Agent
|
|||
* Request Identities
|
||||
*
|
||||
* See "2.5.2 Requesting a list of protocol 2 keys"
|
||||
* Returns an array containing zero or more System_SSH_Agent_Identity objects
|
||||
* Returns an array containing zero or more \phpseclib\System\SSH\Agent\Identity objects
|
||||
*
|
||||
* @return array
|
||||
* @access public
|
||||
|
@ -304,14 +152,14 @@ class System_SSH_Agent
|
|||
return array();
|
||||
}
|
||||
|
||||
$packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES);
|
||||
$packet = pack('NC', 1, self::SSH_AGENTC_REQUEST_IDENTITIES);
|
||||
if (strlen($packet) != fputs($this->fsock, $packet)) {
|
||||
user_error('Connection closed while requesting identities');
|
||||
}
|
||||
|
||||
$length = current(unpack('N', fread($this->fsock, 4)));
|
||||
$type = ord(fread($this->fsock, 1));
|
||||
if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) {
|
||||
if ($type != self::SSH_AGENT_IDENTITIES_ANSWER) {
|
||||
user_error('Unable to request identities');
|
||||
}
|
||||
|
||||
|
@ -329,10 +177,7 @@ class System_SSH_Agent
|
|||
$key_type = substr($key_blob, 4, $length);
|
||||
switch ($key_type) {
|
||||
case 'ssh-rsa':
|
||||
if (!class_exists('Crypt_RSA')) {
|
||||
include_once 'Crypt/RSA.php';
|
||||
}
|
||||
$key = new Crypt_RSA();
|
||||
$key = new RSA();
|
||||
$key->loadKey($key_str);
|
||||
break;
|
||||
case 'ssh-dss':
|
||||
|
@ -341,7 +186,7 @@ class System_SSH_Agent
|
|||
}
|
||||
// resources are passed by reference by default
|
||||
if (isset($key)) {
|
||||
$identity = new System_SSH_Agent_Identity($this->fsock);
|
||||
$identity = new Identity($this->fsock);
|
||||
$identity->setPublicKey($key);
|
||||
$identity->setPublicKeyBlob($key_blob);
|
||||
$identities[] = $identity;
|
||||
|
@ -362,8 +207,8 @@ class System_SSH_Agent
|
|||
*/
|
||||
function startSSHForwarding($ssh)
|
||||
{
|
||||
if ($this->forward_status == SYSTEM_SSH_AGENT_FORWARD_NONE) {
|
||||
$this->forward_status = SYSTEM_SSH_AGENT_FORWARD_REQUEST;
|
||||
if ($this->forward_status == self::FORWARD_NONE) {
|
||||
$this->forward_status = self::FORWARD_REQUEST;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -402,7 +247,7 @@ class System_SSH_Agent
|
|||
}
|
||||
|
||||
$ssh->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_OPEN;
|
||||
$this->forward_status = SYSTEM_SSH_AGENT_FORWARD_ACTIVE;
|
||||
$this->forward_status = self::FORWARD_ACTIVE;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -419,7 +264,7 @@ class System_SSH_Agent
|
|||
*/
|
||||
function _on_channel_open($ssh)
|
||||
{
|
||||
if ($this->forward_status == SYSTEM_SSH_AGENT_FORWARD_REQUEST) {
|
||||
if ($this->forward_status == self::FORWARD_REQUEST) {
|
||||
$this->_request_forwarding($ssh);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,158 @@
|
|||
<?php
|
||||
/**
|
||||
* Pure-PHP ssh-agent client.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category System
|
||||
* @package SSH\Agent
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2009 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
* @internal See http://api.libssh.org/rfc/PROTOCOL.agent
|
||||
*/
|
||||
|
||||
namespace phpseclib\System\SSH\Agent;
|
||||
|
||||
use phpseclib\System\SSH\Agent;
|
||||
|
||||
/**
|
||||
* Pure-PHP ssh-agent client identity object
|
||||
*
|
||||
* Instantiation should only be performed by \phpseclib\System\SSH\Agent class.
|
||||
* This could be thought of as implementing an interface that phpseclib\Crypt\RSA
|
||||
* implements. ie. maybe a Net_SSH_Auth_PublicKey interface or something.
|
||||
* The methods in this interface would be getPublicKey and sign since those are the
|
||||
* methods phpseclib looks for to perform public key authentication.
|
||||
*
|
||||
* @package SSH\Agent
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @access internal
|
||||
*/
|
||||
class Identity
|
||||
{
|
||||
/**
|
||||
* Key Object
|
||||
*
|
||||
* @var \phpseclib\Crypt\RSA
|
||||
* @access private
|
||||
* @see self::getPublicKey()
|
||||
*/
|
||||
var $key;
|
||||
|
||||
/**
|
||||
* Key Blob
|
||||
*
|
||||
* @var string
|
||||
* @access private
|
||||
* @see self::sign()
|
||||
*/
|
||||
var $key_blob;
|
||||
|
||||
/**
|
||||
* Socket Resource
|
||||
*
|
||||
* @var resource
|
||||
* @access private
|
||||
* @see self::sign()
|
||||
*/
|
||||
var $fsock;
|
||||
|
||||
/**
|
||||
* Default Constructor.
|
||||
*
|
||||
* @param resource $fsock
|
||||
* @return \phpseclib\System\SSH\Agent\Identity
|
||||
* @access private
|
||||
*/
|
||||
function __construct($fsock)
|
||||
{
|
||||
$this->fsock = $fsock;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Public Key
|
||||
*
|
||||
* Called by \phpseclib\System\SSH\Agent::requestIdentities()
|
||||
*
|
||||
* @param \phpseclib\Crypt\RSA $key
|
||||
* @access private
|
||||
*/
|
||||
function setPublicKey($key)
|
||||
{
|
||||
$this->key = $key;
|
||||
$this->key->setPublicKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Public Key
|
||||
*
|
||||
* Called by \phpseclib\System\SSH\Agent::requestIdentities(). The key blob could be extracted from $this->key
|
||||
* but this saves a small amount of computation.
|
||||
*
|
||||
* @param string $key_blob
|
||||
* @access private
|
||||
*/
|
||||
function setPublicKeyBlob($key_blob)
|
||||
{
|
||||
$this->key_blob = $key_blob;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Public Key
|
||||
*
|
||||
* Wrapper for $this->key->getPublicKey()
|
||||
*
|
||||
* @param int $format optional
|
||||
* @return mixed
|
||||
* @access public
|
||||
*/
|
||||
function getPublicKey($format = null)
|
||||
{
|
||||
return !isset($format) ? $this->key->getPublicKey() : $this->key->getPublicKey($format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Signature Mode
|
||||
*
|
||||
* Doesn't do anything as ssh-agent doesn't let you pick and choose the signature mode. ie.
|
||||
* ssh-agent's only supported mode is \phpseclib\Crypt\RSA::SIGNATURE_PKCS1
|
||||
*
|
||||
* @param int $mode
|
||||
* @access public
|
||||
*/
|
||||
function setSignatureMode($mode)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a signature
|
||||
*
|
||||
* See "2.6.2 Protocol 2 private key signature request"
|
||||
*
|
||||
* @param string $message
|
||||
* @return string
|
||||
* @access public
|
||||
*/
|
||||
function sign($message)
|
||||
{
|
||||
// the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE
|
||||
$packet = pack('CNa*Na*N', Agent::SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, 0);
|
||||
$packet = pack('Na*', strlen($packet), $packet);
|
||||
if (strlen($packet) != fputs($this->fsock, $packet)) {
|
||||
user_error('Connection closed during signing');
|
||||
}
|
||||
|
||||
$length = current(unpack('N', fread($this->fsock, 4)));
|
||||
$type = ord(fread($this->fsock, 1));
|
||||
if ($type != Agent::SSH_AGENT_SIGN_RESPONSE) {
|
||||
user_error('Unable to retrieve signature');
|
||||
}
|
||||
|
||||
$signature_blob = fread($this->fsock, $length - 1);
|
||||
// the only other signature format defined - ssh-dss - is the same length as ssh-rsa
|
||||
// the + 12 is for the other various SSH added length fields
|
||||
return substr($signature_blob, strlen('ssh-rsa') + 12);
|
||||
}
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Pure-PHP ssh-agent client wrapper
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* Originally System_SSH_Agent was accessed as System/SSH_Agent.php instead of
|
||||
* System/SSH/Agent.php. The problem with this is that PSR0 compatible autoloaders
|
||||
* don't support that kind of directory layout hence the package being moved and
|
||||
* this "alias" being created to maintain backwards compatibility.
|
||||
*
|
||||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @category System
|
||||
* @package System_SSH_Agent
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright 2014 Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
* @internal See http://api.libssh.org/rfc/PROTOCOL.agent
|
||||
*/
|
||||
|
||||
require_once 'SSH/Agent.php';
|
|
@ -460,10 +460,6 @@ function get_preg($argument, $regexp) {
|
|||
$language = $_SESSION['language'];
|
||||
$language2 = explode ('.', $language);
|
||||
setlocale(LC_ALL, $language2[0]);
|
||||
// workaround for buggy PHP with Turkish
|
||||
if (($language == 'tr_TR.utf8') && (version_compare(phpversion(), '5.5') < 0)) {
|
||||
setlocale(LC_CTYPE, 'en_GB');
|
||||
}
|
||||
// First we check "positive" cases
|
||||
$pregexpr = '';
|
||||
switch ($regexp) {
|
||||
|
@ -592,10 +588,6 @@ function get_preg($argument, $regexp) {
|
|||
if (preg_match($pregexpr, $argument)) {
|
||||
/* Bug in php preg_match doesn't work correct with utf8 */
|
||||
setlocale(LC_ALL, $language);
|
||||
// workaround for buggy PHP with Turkish
|
||||
if (($language == 'tr_TR.utf8') && (version_compare(phpversion(), '5.5') < 0)) {
|
||||
setlocale(LC_CTYPE, 'en_GB');
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// Now we check "negative" cases, characters which are not allowed
|
||||
|
@ -615,18 +607,10 @@ function get_preg($argument, $regexp) {
|
|||
if (!preg_match($pregexpr, $argument)) {
|
||||
/* Bug in php preg_match doesn't work correct with utf8 */
|
||||
setlocale(LC_ALL, $language);
|
||||
// workaround for buggy PHP with Turkish
|
||||
if (($language == 'tr_TR.utf8') && (version_compare(phpversion(), '5.5') < 0)) {
|
||||
setlocale(LC_CTYPE, 'en_GB');
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/* Bug in php preg_match doesn't work correct with utf8 */
|
||||
setlocale(LC_ALL, $language);
|
||||
// workaround for buggy PHP with Turkish
|
||||
if (($language == 'tr_TR.utf8') && (version_compare(phpversion(), '5.5') < 0)) {
|
||||
setlocale(LC_CTYPE, 'en_GB');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,8 +36,8 @@ include_once("../lib/status.inc");
|
|||
/** config */
|
||||
include_once("../lib/config.inc");
|
||||
|
||||
// check if PHP >= 5.4.0
|
||||
if (version_compare(phpversion(), '5.4.0') < 0) {
|
||||
// check if PHP >= 5.6.0
|
||||
if (version_compare(phpversion(), '5.6.0') < 0) {
|
||||
echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n\n";
|
||||
echo "<html>\n<head>\n";
|
||||
echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n";
|
||||
|
@ -47,7 +47,7 @@ if (version_compare(phpversion(), '5.4.0') < 0) {
|
|||
echo "<link rel=\"icon\" href=\"../graphics/logo136.png\">\n";
|
||||
echo "<title>LDAP Account Manager</title>\n";
|
||||
echo "</head><body>\n";
|
||||
StatusMessage("ERROR", "LAM needs a PHP 5 version which is greater or equal than 5.4.0.", "Please upgrade your PHP installation. The found version is " . phpversion());
|
||||
StatusMessage("ERROR", "LAM needs a PHP 5 version which is greater or equal than 5.6.0.", "Please upgrade your PHP installation. The found version is " . phpversion());
|
||||
echo "<br><br>";
|
||||
echo "</body></html>";
|
||||
exit();
|
||||
|
|
|
@ -73,10 +73,6 @@ function setlanguage() {
|
|||
}
|
||||
putenv("LANG=" . $code); // e.g. LANG=de_DE
|
||||
setlocale(LC_ALL, $code); // set LC_ALL
|
||||
// workaround for buggy PHP with Turkish
|
||||
if (($code == 'tr_TR.utf8') && (version_compare(phpversion(), '5.5') < 0)) {
|
||||
setlocale(LC_CTYPE, 'en_GB');
|
||||
}
|
||||
$locdir = substr(__FILE__, 0, strlen(__FILE__) - 15) . "/locale"; // set path to translations
|
||||
bindtextdomain("messages", $locdir);
|
||||
bind_textdomain_codeset("messages", $encoding);
|
||||
|
|
|
@ -1,129 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
$Id$
|
||||
|
||||
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||
Copyright (C) 2004 - 2016 Roland Gruber
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
* This file includes functions to control lamdaemon.
|
||||
*
|
||||
* @author Tilo Lutz
|
||||
* @author Roland Gruber
|
||||
* @author Thomas Manninger
|
||||
*
|
||||
* @package modules
|
||||
*/
|
||||
|
||||
/**
|
||||
* Sends commands to lamdaemon script.
|
||||
*
|
||||
* @param array $command command to execute
|
||||
* @param string $server remote server
|
||||
* @return array Output of lamdaemon
|
||||
*
|
||||
*/
|
||||
function lamdaemon($command, $server) {
|
||||
if ($server == '') {
|
||||
return array();
|
||||
}
|
||||
// add phpseclib to include path
|
||||
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/3rdParty/phpseclib');
|
||||
include_once('Net/SSH2.php');
|
||||
try {
|
||||
$handle = lamConnectSSH($server);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
return array("ERROR," . $e->getMessage() . "," . $server);
|
||||
}
|
||||
$output = $handle->exec("sudo " . $_SESSION['config']->get_scriptPath() . ' ' . escapeshellarg($command));
|
||||
return array($output);
|
||||
}
|
||||
|
||||
/**
|
||||
* Connects to the given SSH server.
|
||||
*
|
||||
* @param String $server server name (e.g. localhost or localhost,1234)
|
||||
* @return object handle
|
||||
*/
|
||||
function lamConnectSSH($server) {
|
||||
// add phpseclib to include path
|
||||
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/3rdParty/phpseclib');
|
||||
include_once('Net/SSH2.php');
|
||||
include_once('Crypt/RSA.php');
|
||||
$serverNameParts = explode(",", $server);
|
||||
$handle = false;
|
||||
if (sizeof($serverNameParts) > 1) {
|
||||
$handle = @new Net_SSH2($serverNameParts[0], $serverNameParts[1]);
|
||||
}
|
||||
else {
|
||||
$handle = @new Net_SSH2($server);
|
||||
}
|
||||
if (!$handle) {
|
||||
throw new Exception(_("Unable to connect to remote server!"));
|
||||
}
|
||||
lamLoginSSH($handle);
|
||||
return $handle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a login to the provided SSH handle.
|
||||
*
|
||||
* @param handle $handle SSH handle
|
||||
* @throws Exception login failed
|
||||
*/
|
||||
function lamLoginSSH($handle) {
|
||||
$username = $_SESSION['config']->getScriptUserName();
|
||||
$credentials = $_SESSION['ldap']->decrypt_login();
|
||||
if (empty($username)) {
|
||||
// get user name from current LAM user
|
||||
$sr = @ldap_read($_SESSION['ldap']->server(), $credentials[0], "objectClass=posixAccount", array('uid'), 0, 0, 0, LDAP_DEREF_NEVER);
|
||||
if ($sr) {
|
||||
$entry = @ldap_get_entries($_SESSION['ldap']->server(), $sr);
|
||||
$username = $entry[0]['uid'][0];
|
||||
}
|
||||
if (empty($username)) {
|
||||
throw new Exception(sprintf(_("Your LAM admin user (%s) must be a valid Unix account to work with lamdaemon!"), getAbstractDN($credentials[0])));
|
||||
}
|
||||
}
|
||||
$password = $credentials[1];
|
||||
$keyPath = $_SESSION['config']->getScriptSSHKey();
|
||||
if (!empty($keyPath)) {
|
||||
// use key authentication
|
||||
if (!file_exists($keyPath) || !is_readable($keyPath)) {
|
||||
throw new Exception(sprintf(_("Unable to read %s."), htmlspecialchars($keyPath)));
|
||||
}
|
||||
$key = file_get_contents($keyPath);
|
||||
$rsa = new Crypt_RSA();
|
||||
$keyPassword = $_SESSION['config']->getScriptSSHKeyPassword();
|
||||
if (!empty($keyPassword)) {
|
||||
$rsa->setPassword($keyPassword);
|
||||
}
|
||||
if (!$rsa->loadKey($key)) {
|
||||
throw new Exception(sprintf(_("Unable to load key %s."), htmlspecialchars($keyPath)));
|
||||
}
|
||||
$password = $rsa;
|
||||
}
|
||||
$login = @$handle->login($username, $password);
|
||||
if (!$login) {
|
||||
throw new Exception(_("Unable to login to remote server!"));
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -45,8 +45,8 @@ include_once("account.inc");
|
|||
include_once("baseModule.inc");
|
||||
/** access to LDAP server */
|
||||
include_once("ldap.inc");
|
||||
/** lamdaemon functions */
|
||||
include_once("lamdaemon.inc");
|
||||
/** remote functions */
|
||||
include_once("remote.inc");
|
||||
/** security functions */
|
||||
include_once("security.inc");
|
||||
/** meta HTML classes */
|
||||
|
@ -532,10 +532,12 @@ function buildUploadAccounts($type, $data, $ids, $selectedModules) {
|
|||
}
|
||||
}
|
||||
if (sizeof($errors) > 0) {
|
||||
for ($i = 0; (($i < sizeof($errors)) || ($i > 49)); $i++) call_user_func_array("StatusMessage", $errors[$i]);
|
||||
for ($i = 0; (($i < sizeof($errors)) || ($i > 49)); $i++) {
|
||||
call_user_func_array("StatusMessage", $errors[$i]);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else return $partialAccounts;
|
||||
return $partialAccounts;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -475,7 +475,7 @@ class courierMailAccount extends baseModule {
|
|||
'description' => _('Home directory'),
|
||||
'help' => 'homeDirectory',
|
||||
'example' => _('/home/smiller'),
|
||||
'required' => 'true'
|
||||
'required' => true
|
||||
);
|
||||
}
|
||||
return $return;
|
||||
|
|
|
@ -248,7 +248,7 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I
|
|||
'help' => 'subnet',
|
||||
'example' => '192.168.10.0',
|
||||
'required' => true,
|
||||
'unique' => 'true'
|
||||
'unique' => true
|
||||
),
|
||||
array(
|
||||
'name' => 'dhcp_settings_domainName',
|
||||
|
|
|
@ -161,7 +161,7 @@ class eduPerson extends baseModule {
|
|||
'description' => _('Principal name'),
|
||||
'help' => 'eduPersonPrincipalName',
|
||||
'example' => _('user@company.com'),
|
||||
'unique' => 'true'
|
||||
'unique' => true
|
||||
),
|
||||
array(
|
||||
'name' => 'eduPerson_primaryAffiliation',
|
||||
|
|
|
@ -32,7 +32,7 @@ $Id$
|
|||
*
|
||||
* @package modules
|
||||
*/
|
||||
class kolabSharedFolder extends baseModule { // TODO folder type
|
||||
class kolabSharedFolder extends baseModule {
|
||||
|
||||
/** cache for mailHost values */
|
||||
private $mailHostCache = null;
|
||||
|
@ -49,7 +49,6 @@ class kolabSharedFolder extends baseModule { // TODO folder type
|
|||
// call parent constructor
|
||||
parent::__construct($scope);
|
||||
$this->folderTypes = array(
|
||||
// TODO reactivate types when stable 3.1 is released
|
||||
/*_('Shared address book') => 'addressbook',
|
||||
_('Shared calendar') => 'calendar',
|
||||
_('Shared journal') => 'journal',
|
||||
|
|
|
@ -186,10 +186,8 @@ class posixAccount extends baseModule implements passwordService {
|
|||
$loginShellsHelp = new htmlHelpLink('loginShells', get_class($this));
|
||||
$loginShellsHelp->alignment = htmlElement::ALIGN_TOP;
|
||||
$selfServiceContainer->addElement($loginShellsHelp, true);
|
||||
if (version_compare(phpversion(), '5.4.26') >= 0) {
|
||||
$selfServiceContainer->addElement(new htmlTableExtendedInputCheckbox('posixAccount_useOldPwd', false, _('Password change with old password')));
|
||||
$selfServiceContainer->addElement(new htmlHelpLink('useOldPwd', get_class($this)), true);
|
||||
}
|
||||
$selfServiceContainer->addElement(new htmlTableExtendedInputCheckbox('posixAccount_useOldPwd', false, _('Password change with old password')));
|
||||
$selfServiceContainer->addElement(new htmlHelpLink('useOldPwd', get_class($this)), true);
|
||||
$return['selfServiceSettings'] = $selfServiceContainer;
|
||||
}
|
||||
// profile checks
|
||||
|
@ -734,7 +732,9 @@ class posixAccount extends baseModule implements passwordService {
|
|||
elseif (!in_array($temp[0], $this->lamdaemonServers)) {
|
||||
continue;
|
||||
}
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -745,11 +745,11 @@ class posixAccount extends baseModule implements passwordService {
|
|||
"0".$_SESSION['config']->get_scriptRights(),
|
||||
$this->attributes['uidNumber'][0],
|
||||
$this->attributes['gidNumber'][0])
|
||||
),
|
||||
$server);
|
||||
));
|
||||
$remote->disconnect();
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
$singleresult = explode(",", $result[0]);
|
||||
if (!empty($result)) {
|
||||
$singleresult = explode(",", $result);
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'INFO') || ($singleresult[0] == 'WARN')) {
|
||||
$messages[] = $singleresult;
|
||||
}
|
||||
|
@ -769,7 +769,9 @@ class posixAccount extends baseModule implements passwordService {
|
|||
}
|
||||
$temp = explode(":", $lamdaemonServers[$i]);
|
||||
$server = $temp[0];
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -779,11 +781,11 @@ class posixAccount extends baseModule implements passwordService {
|
|||
$this->orig[$homeDirAttr][0],
|
||||
$this->attributes['uidNumber'][0],
|
||||
$this->attributes[$homeDirAttr][0])
|
||||
),
|
||||
$server);
|
||||
));
|
||||
$remote->disconnect();
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
$singleresult = explode(",", $result[0]);
|
||||
if (!empty($result)) {
|
||||
$singleresult = explode(",", $result);
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'INFO') || ($singleresult[0] == 'WARN')) {
|
||||
$messages[] = $singleresult;
|
||||
}
|
||||
|
@ -800,7 +802,9 @@ class posixAccount extends baseModule implements passwordService {
|
|||
}
|
||||
$temp = explode(":", $lamdaemonServers[$i]);
|
||||
$server = $temp[0];
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -810,11 +814,11 @@ class posixAccount extends baseModule implements passwordService {
|
|||
$this->orig[$homeDirAttr][0],
|
||||
$this->attributes['uidNumber'][0],
|
||||
$this->attributes['gidNumber'][0])
|
||||
),
|
||||
$server);
|
||||
));
|
||||
$remote->disconnect();
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
$singleresult = explode(",", $result[0]);
|
||||
if (!empty($result)) {
|
||||
$singleresult = explode(",", $result);
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'INFO') || ($singleresult[0] == 'WARN')) {
|
||||
$messages[] = $singleresult;
|
||||
}
|
||||
|
@ -937,7 +941,9 @@ class posixAccount extends baseModule implements passwordService {
|
|||
}
|
||||
// try to delete directory on all servers
|
||||
for ($i = 0; $i < sizeof($lamdaemonServers); $i++) {
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($lamdaemonServers[$i]);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -947,16 +953,14 @@ class posixAccount extends baseModule implements passwordService {
|
|||
$this->attributes[$homeDirAttr][0],
|
||||
$this->attributes['uidNumber'][0]
|
||||
)
|
||||
),
|
||||
$lamdaemonServers[$i]);
|
||||
));
|
||||
$remote->disconnect();
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
foreach ($result as $singleresult) {
|
||||
$singleresult = explode(",", $singleresult);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
if (!empty($result)) {
|
||||
$singleresult = explode(",", $result);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1272,7 +1276,9 @@ class posixAccount extends baseModule implements passwordService {
|
|||
$temp = explode(":", $lamdaemonServers[$i]);
|
||||
$server = $temp[0];
|
||||
if (isset($_POST['form_subpage_' . get_class($this) . '_homedir_create_' . $i])) {
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -1283,22 +1289,22 @@ class posixAccount extends baseModule implements passwordService {
|
|||
"0".$_SESSION['config']->get_scriptRights(),
|
||||
$this->attributes['uidNumber'][0],
|
||||
$this->attributes['gidNumber'][0])
|
||||
),
|
||||
$server);
|
||||
));
|
||||
$remote->disconnect();
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
foreach ($result as $singleresult) {
|
||||
$singleresult = explode(",", $singleresult);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
if (!empty($result)) {
|
||||
$singleresult = explode(",", $result);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif (isset($_POST['form_subpage_' . get_class($this) . '_homedir_delete_' . $i])) {
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -1308,16 +1314,14 @@ class posixAccount extends baseModule implements passwordService {
|
|||
$this->attributes[$homeDirAttr][0],
|
||||
$this->attributes['uidNumber'][0]
|
||||
)
|
||||
),
|
||||
$server);
|
||||
));
|
||||
$remote->disconnect();
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
foreach ($result as $singleresult) {
|
||||
$singleresult = explode(",", $singleresult);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
if (!empty($result)) {
|
||||
$singleresult = explode(",", $result);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1662,7 +1666,9 @@ class posixAccount extends baseModule implements passwordService {
|
|||
if (isset($temp[1])) {
|
||||
$label = $temp[1];
|
||||
}
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -1670,11 +1676,11 @@ class posixAccount extends baseModule implements passwordService {
|
|||
"home",
|
||||
"check",
|
||||
$this->attributes[$homeDirAttr][0])
|
||||
),
|
||||
$server);
|
||||
));
|
||||
$remote->disconnect();
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
$returnValue = trim($result[0]);
|
||||
if (!empty($result)) {
|
||||
$returnValue = trim($result);
|
||||
if ($returnValue == 'ok') {
|
||||
$homeServerContainer->addElement(new htmlOutputText($label));
|
||||
$homeServerContainer->addElement(new htmlSpacer('5px', null));
|
||||
|
@ -2533,7 +2539,9 @@ class posixAccount extends baseModule implements passwordService {
|
|||
// create home directories
|
||||
elseif ($temp['counter'] < (sizeof($temp['groups']) + sizeof($temp['createHomes']))) {
|
||||
$pos = $temp['createHomes'][$temp['counter'] - sizeof($temp['groups'])];
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($data[$pos][$ids['posixAccount_createHomeDir']]);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -2545,11 +2553,11 @@ class posixAccount extends baseModule implements passwordService {
|
|||
$accounts[$pos]['uidNumber'],
|
||||
$accounts[$pos]['gidNumber'],
|
||||
)
|
||||
),
|
||||
$data[$pos][$ids['posixAccount_createHomeDir']]);
|
||||
));
|
||||
$remote->disconnect();
|
||||
$errors = array();
|
||||
if (($result != false) && (sizeof($result) == 1)) {
|
||||
$parts = explode(",", $result[0]);
|
||||
if (!empty($result)) {
|
||||
$parts = explode(",", $result);
|
||||
if (in_array($parts[0], array('ERROR', 'WARN'))) {
|
||||
$errors[] = $parts;
|
||||
}
|
||||
|
|
|
@ -186,11 +186,14 @@ class quota extends baseModule {
|
|||
$temp = explode(":", $lamdaemonServers[$s]);
|
||||
$server = $temp[0];
|
||||
// get quotas
|
||||
$quotas = lamdaemon(implode(quota::$SPLIT_DELIMITER, array($userName, "quota", "get", $this->get_scope())), $server);
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$quotas = $remote->execute(implode(quota::$SPLIT_DELIMITER, array($userName, "quota", "get", $this->get_scope())));
|
||||
$remote->disconnect();
|
||||
if (sizeof($quotas) == 0) {
|
||||
continue;
|
||||
}
|
||||
$allQuotas = explode(":", $quotas[0]);
|
||||
$allQuotas = explode(":", $quotas);
|
||||
array_pop($allQuotas); // remove empty element at the end
|
||||
for ($i = 0; $i < sizeof($allQuotas); $i++) {
|
||||
if (strpos($allQuotas[$i], quota::$QUOTA_PREFIX) !== 0) continue;
|
||||
|
@ -280,7 +283,10 @@ class quota extends baseModule {
|
|||
$quotastring = $quotastring . $this->quota[$server][$i][0] . ',' . $this->quota[$server][$i][2] . ',' . $this->quota[$server][$i][3]
|
||||
. ',' . $this->quota[$server][$i][6] . ',' . $this->quota[$server][$i][7] . ':';
|
||||
}
|
||||
lamdaemon(implode(quota::$SPLIT_DELIMITER, array($id, "quota", "set", $this->get_scope(), "$quotastring\n")), $server);
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$remote->execute(implode(quota::$SPLIT_DELIMITER, array($id, "quota", "set", $this->get_scope(), "$quotastring\n")));
|
||||
$remote->disconnect();
|
||||
}
|
||||
return $messages;
|
||||
}
|
||||
|
@ -319,7 +325,10 @@ class quota extends baseModule {
|
|||
$quotastring = $quotastring . $this->quota[$server][$i][0] . ',0,0,0,0:';
|
||||
$i++;
|
||||
}
|
||||
lamdaemon(implode(quota::$SPLIT_DELIMITER, array($id, "quota", "set", $this->get_scope(), "$quotastring\n")), $server);
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$remote->execute(implode(quota::$SPLIT_DELIMITER, array($id, "quota", "set", $this->get_scope(), "$quotastring\n")));
|
||||
$remote->disconnect();
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
@ -483,11 +492,14 @@ class quota extends baseModule {
|
|||
$description = $temp[1] . ' (' . $temp[0] . ')';
|
||||
}
|
||||
// Get quotas
|
||||
$quotas = lamdaemon(implode(quota::$SPLIT_DELIMITER, array("+", "quota", "get", $this->get_scope())), $server);
|
||||
if (sizeof($quotas) == 0) {
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$quotas = $remote->execute(implode(quota::$SPLIT_DELIMITER, array("+", "quota", "get", $this->get_scope())));
|
||||
$remote->disconnect();
|
||||
if (empty($quotas)) {
|
||||
continue;
|
||||
}
|
||||
$dirs = explode(":", $quotas[0]);
|
||||
$dirs = explode(":", $quotas);
|
||||
array_pop($dirs); // remove empty element at the end
|
||||
for ($i = 0; $i < sizeof($dirs); $i++) {
|
||||
if (strpos($dirs[$i], quota::$QUOTA_PREFIX) !== 0) {
|
||||
|
@ -556,8 +568,11 @@ class quota extends baseModule {
|
|||
$server = $temp[0];
|
||||
$id = $this->replaceSpecialChars($server);
|
||||
// Get quotas
|
||||
$quotas = lamdaemon(implode(quota::$SPLIT_DELIMITER, array("+", "quota", "get", $this->get_scope())), $server);
|
||||
$dirs = explode(":", $quotas[0]);
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$quotas = $remote->execute(implode(quota::$SPLIT_DELIMITER, array("+", "quota", "get", $this->get_scope())));
|
||||
$remote->disconnect();
|
||||
$dirs = explode(":", $quotas);
|
||||
array_pop($dirs); // remove empty element at the end
|
||||
for ($i = 0; $i < sizeof($dirs); $i++) {
|
||||
if (strpos($dirs[$i], quota::$QUOTA_PREFIX) !== 0) {
|
||||
|
@ -669,8 +684,11 @@ class quota extends baseModule {
|
|||
$temp = explode(":", $lamdaemonServers[$s]);
|
||||
$server = $temp[0];
|
||||
// Get quotas
|
||||
$quotas = lamdaemon(implode(quota::$SPLIT_DELIMITER, array("+", "quota", "get", $this->get_scope())), $server);
|
||||
$dirs = explode(":", $quotas[0]);
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$quotas = $remote->execute(implode(quota::$SPLIT_DELIMITER, array("+", "quota", "get", $this->get_scope())));
|
||||
$remote->disconnect();
|
||||
$dirs = explode(":", $quotas);
|
||||
array_pop($dirs); // remove empty element at the end
|
||||
for ($i = 0; $i < sizeof($dirs); $i++) {
|
||||
if (strpos($dirs[$i], quota::$QUOTA_PREFIX) !== 0) {
|
||||
|
@ -786,13 +804,14 @@ class quota extends baseModule {
|
|||
$dir = $mpParts[1];
|
||||
$quotaString = implode(quota::$SPLIT_DELIMITER, array($name, "quota", "set", $this->get_scope(), $dir . ',' .
|
||||
implode(',', $temp['accounts'][$name][$mountPoints[$m]]) . "\n"));
|
||||
$result = lamdaemon($quotaString, $server);
|
||||
if (is_array($result)) {
|
||||
for ($i = 0; $i < sizeof($result); $i++) {
|
||||
$parts = explode(",", $result);
|
||||
if ($parts[0] == 'ERROR') {
|
||||
$errors[] = array('ERROR', $parts[1], $parts[2]);
|
||||
}
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute($quotaString);
|
||||
$remote->disconnect();
|
||||
if (!empty($result)) {
|
||||
$parts = explode(",", $result);
|
||||
if ($parts[0] == 'ERROR') {
|
||||
$errors[] = array('ERROR', $parts[1], $parts[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
$Id$
|
||||
|
||||
|
@ -64,7 +65,7 @@ class sambaSamAccount extends baseModule implements passwordService {
|
|||
private $cachedGroupSIDList = null;
|
||||
/** cache for domain list */
|
||||
private $cachedDomainList = null;
|
||||
/** delimiter for lamdaemon commands */
|
||||
/** delimiter for remote commands */
|
||||
private static $SPLIT_DELIMITER = "###x##y##x###";
|
||||
|
||||
|
||||
|
@ -1541,16 +1542,18 @@ class sambaSamAccount extends baseModule implements passwordService {
|
|||
$return->addElement(new htmlSpacer(null, '10px'), true);
|
||||
$homeServerContainer = new htmlTable();
|
||||
$homeServerContainer->colspan = 5;
|
||||
// get list of lamdaemon servers
|
||||
$lamdaemonServers = explode(";", $_SESSION['config']->get_scriptServers());
|
||||
for ($i = 0; $i < sizeof($lamdaemonServers); $i++) {
|
||||
$temp = explode(":", $lamdaemonServers[$i]);
|
||||
// get list of remote servers
|
||||
$remoteServers = explode(";", $_SESSION['config']->get_scriptServers());
|
||||
for ($i = 0; $i < sizeof($remoteServers); $i++) {
|
||||
$temp = explode(":", $remoteServers[$i]);
|
||||
$server = $temp[0];
|
||||
$label = $temp[0];
|
||||
if (isset($temp[1])) {
|
||||
$label = $temp[1];
|
||||
}
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -1558,11 +1561,11 @@ class sambaSamAccount extends baseModule implements passwordService {
|
|||
"home",
|
||||
"check",
|
||||
$this->attributes['sambaProfilePath'][0])
|
||||
),
|
||||
$server);
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
$returnValue = trim($result[0]);
|
||||
));
|
||||
$remote->disconnect();
|
||||
// remote command results
|
||||
if (!empty($result)) {
|
||||
$returnValue = trim($result);
|
||||
if ($returnValue == 'ok') {
|
||||
$homeServerContainer->addElement(new htmlOutputText($label));
|
||||
$homeServerContainer->addElement(new htmlSpacer('5px', null));
|
||||
|
@ -1614,13 +1617,15 @@ class sambaSamAccount extends baseModule implements passwordService {
|
|||
if (empty($uidNumber) || empty($gidNumber)) {
|
||||
return;
|
||||
}
|
||||
// get list of lamdaemon servers
|
||||
$lamdaemonServers = explode(";", $_SESSION['config']->get_scriptServers());
|
||||
for ($i = 0; $i < sizeof($lamdaemonServers); $i++) {
|
||||
$temp = explode(":", $lamdaemonServers[$i]);
|
||||
// get list of remote servers
|
||||
$remoteServers = explode(";", $_SESSION['config']->get_scriptServers());
|
||||
for ($i = 0; $i < sizeof($remoteServers); $i++) {
|
||||
$temp = explode(":", $remoteServers[$i]);
|
||||
$server = $temp[0];
|
||||
if (isset($_POST['form_subpage_' . get_class($this) . '_homedir_create_' . $i])) {
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -1631,22 +1636,22 @@ class sambaSamAccount extends baseModule implements passwordService {
|
|||
"0".$_SESSION['config']->get_scriptRights(),
|
||||
$uidNumber,
|
||||
$gidNumber)
|
||||
),
|
||||
$server);
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
foreach ($result as $singleresult) {
|
||||
$singleresult = explode(",", $singleresult);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
));
|
||||
$remote->disconnect();
|
||||
// remote command results
|
||||
if (!empty($result)) {
|
||||
$singleresult = explode(",", $result);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif (isset($_POST['form_subpage_' . get_class($this) . '_homedir_delete_' . $i])) {
|
||||
$result = lamdaemon(
|
||||
$remote = new \LAM\REMOTE\Remote();
|
||||
$remote->connect($server);
|
||||
$result = $remote->execute(
|
||||
implode(
|
||||
self::$SPLIT_DELIMITER,
|
||||
array(
|
||||
|
@ -1656,16 +1661,14 @@ class sambaSamAccount extends baseModule implements passwordService {
|
|||
$this->attributes['sambaProfilePath'][0],
|
||||
$uidNumber
|
||||
)
|
||||
),
|
||||
$server);
|
||||
// lamdaemon results
|
||||
if (is_array($result)) {
|
||||
foreach ($result as $singleresult) {
|
||||
$singleresult = explode(",", $singleresult);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
));
|
||||
$remote->disconnect();
|
||||
// remote command results
|
||||
if (!empty($result)) {
|
||||
$singleresult = explode(",", $result);
|
||||
if (is_array($singleresult)) {
|
||||
if (($singleresult[0] == 'ERROR') || ($singleresult[0] == 'WARN') || ($singleresult[0] == 'INFO')) {
|
||||
$return[] = $singleresult;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,164 @@
|
|||
<?php
|
||||
namespace LAM\REMOTE;
|
||||
use \Exception;
|
||||
use \phpseclib\Net\SSH2;
|
||||
use \phpseclib\Crypt\RSA;
|
||||
/*
|
||||
$Id$
|
||||
|
||||
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||
Copyright (C) 2017 Roland Gruber
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
* This file includes functions to control LAM remote executions.
|
||||
*
|
||||
* @author Roland Gruber
|
||||
*
|
||||
* @package modules
|
||||
*/
|
||||
|
||||
/**
|
||||
* Runs remote commands.
|
||||
*
|
||||
* @author Roland Gruber
|
||||
*/
|
||||
class Remote {
|
||||
|
||||
/** SSH2 server handle */
|
||||
private $server = null;
|
||||
|
||||
/**
|
||||
* Constructor, include SSH library.
|
||||
*/
|
||||
public function __construct() {
|
||||
$this->includeSshLibrary();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends commands to remote script.
|
||||
*
|
||||
* @param string $command command to execute
|
||||
* @return string output of remote script
|
||||
*/
|
||||
public function execute($command) {
|
||||
if ($this->server == null) {
|
||||
return array();
|
||||
}
|
||||
return $this->server->exec("sudo " . $_SESSION['config']->get_scriptPath() . ' ' . escapeshellarg($command));
|
||||
}
|
||||
|
||||
/**
|
||||
* Connects to the given SSH server.
|
||||
*
|
||||
* @param String $server server name (e.g. localhost or localhost,1234)
|
||||
*/
|
||||
public function connect($server) {
|
||||
$serverNameParts = explode(",", $server);
|
||||
$handle = false;
|
||||
if (sizeof($serverNameParts) > 1) {
|
||||
$handle = @new SSH2($serverNameParts[0], $serverNameParts[1]);
|
||||
}
|
||||
else {
|
||||
$handle = @new SSH2($server);
|
||||
}
|
||||
if (!$handle) {
|
||||
throw new Exception(_("Unable to connect to remote server!"));
|
||||
}
|
||||
$this->loginSSH($handle);
|
||||
$this->server = $handle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the connection.
|
||||
*/
|
||||
public function disconnect() {
|
||||
if ($this->server == null) {
|
||||
return;
|
||||
}
|
||||
$this->server->disconnect();
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a login to the provided SSH handle.
|
||||
*
|
||||
* @param SSH2 $handle SSH handle
|
||||
* @throws Exception login failed
|
||||
*/
|
||||
private function loginSSH($handle) {
|
||||
$username = $_SESSION['config']->getScriptUserName();
|
||||
$credentials = $_SESSION['ldap']->decrypt_login();
|
||||
if (empty($username)) {
|
||||
// get user name from current LAM user
|
||||
$sr = @ldap_read($_SESSION['ldap']->server(), $credentials[0], "objectClass=posixAccount", array('uid'), 0, 0, 0, LDAP_DEREF_NEVER);
|
||||
if ($sr) {
|
||||
$entry = @ldap_get_entries($_SESSION['ldap']->server(), $sr);
|
||||
$username = $entry[0]['uid'][0];
|
||||
}
|
||||
if (empty($username)) {
|
||||
throw new Exception(sprintf(_("Your LAM admin user (%s) must be a valid Unix account to work with lamdaemon!"), getAbstractDN($credentials[0])));
|
||||
}
|
||||
}
|
||||
$password = $credentials[1];
|
||||
$keyPath = $_SESSION['config']->getScriptSSHKey();
|
||||
if (!empty($keyPath)) {
|
||||
// use key authentication
|
||||
if (!file_exists($keyPath) || !is_readable($keyPath)) {
|
||||
throw new Exception(sprintf(_("Unable to read %s."), htmlspecialchars($keyPath)));
|
||||
}
|
||||
$key = file_get_contents($keyPath);
|
||||
$rsa = new RSA();
|
||||
$keyPassword = $_SESSION['config']->getScriptSSHKeyPassword();
|
||||
if (!empty($keyPassword)) {
|
||||
$rsa->setPassword($keyPassword);
|
||||
}
|
||||
if (!$rsa->loadKey($key)) {
|
||||
throw new Exception(sprintf(_("Unable to load key %s."), htmlspecialchars($keyPath)));
|
||||
}
|
||||
$password = $rsa;
|
||||
}
|
||||
$login = @$handle->login($username, $password);
|
||||
if (!$login) {
|
||||
throw new Exception(_("Unable to login to remote server!"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Include the SSH files.
|
||||
*/
|
||||
private function includeSshLibrary() {
|
||||
$prefix = dirname(__FILE__) . '/3rdParty/phpseclib/';
|
||||
require_once($prefix . 'Crypt/Base.php');
|
||||
require_once($prefix . 'Crypt/Blowfish.php');
|
||||
require_once($prefix . 'Crypt/Hash.php');
|
||||
require_once($prefix . 'Crypt/Random.php');
|
||||
require_once($prefix . 'Crypt/RC4.php');
|
||||
require_once($prefix . 'Crypt/Rijndael.php');
|
||||
require_once($prefix . 'Crypt/AES.php');
|
||||
require_once($prefix . 'Crypt/RSA.php');
|
||||
require_once($prefix . 'Crypt/DES.php');
|
||||
require_once($prefix . 'Crypt/TripleDES.php');
|
||||
require_once($prefix . 'Crypt/Twofish.php');
|
||||
require_once($prefix . 'Math/BigInteger.php');
|
||||
require_once($prefix . 'System/SSH/Agent.php');
|
||||
require_once($prefix . 'Net/SSH2.php');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
|
@ -85,8 +85,8 @@ if (isset($_GET['DN'])) {
|
|||
$result = $_SESSION['account']->load_account($DN);
|
||||
if (sizeof($result) > 0) {
|
||||
include '../main_header.php';
|
||||
for ($i=0; $i<sizeof($result); $i++) {
|
||||
call_user_func_array("StatusMessage", $result[$i]);
|
||||
foreach ($result as $message) {
|
||||
call_user_func_array("StatusMessage", $message);
|
||||
}
|
||||
include '../main_footer.php';
|
||||
die();
|
||||
|
@ -107,14 +107,6 @@ else if (count($_POST)==0) {
|
|||
$_SESSION['account']->new_account();
|
||||
}
|
||||
|
||||
// remove double slashes if magic quotes are on
|
||||
if (get_magic_quotes_gpc() == 1) {
|
||||
$postKeys = array_keys($_POST);
|
||||
for ($i = 0; $i < sizeof($postKeys); $i++) {
|
||||
if (is_string($_POST[$postKeys[$i]])) $_POST[$postKeys[$i]] = stripslashes($_POST[$postKeys[$i]]);
|
||||
}
|
||||
}
|
||||
|
||||
// show account page
|
||||
$_SESSION['account']->continue_main();
|
||||
|
||||
|
|
|
@ -625,13 +625,6 @@ function checkInput() {
|
|||
$conf = &$_SESSION['conf_config'];
|
||||
$types = $conf->get_ActiveTypes();
|
||||
|
||||
// remove double slashes if magic quotes are on
|
||||
if (get_magic_quotes_gpc() == 1) {
|
||||
$postKeys = array_keys($_POST);
|
||||
for ($i = 0; $i < sizeof($postKeys); $i++) {
|
||||
if (is_string($_POST[$postKeys[$i]])) $_POST[$postKeys[$i]] = stripslashes($_POST[$postKeys[$i]]);
|
||||
}
|
||||
}
|
||||
// check new preferences
|
||||
$errors = array();
|
||||
if (!$conf->set_ServerURL($_POST['serverurl'])) {
|
||||
|
|
|
@ -90,13 +90,6 @@ $errors = array();
|
|||
$messages = array();
|
||||
// check if submit button was pressed
|
||||
if (isset($_POST['submitFormData'])) {
|
||||
// remove double slashes if magic quotes are on
|
||||
if (get_magic_quotes_gpc() == 1) {
|
||||
$postKeys = array_keys($_POST);
|
||||
for ($i = 0; $i < sizeof($postKeys); $i++) {
|
||||
if (is_string($_POST[$postKeys[$i]])) $_POST[$postKeys[$i]] = stripslashes($_POST[$postKeys[$i]]);
|
||||
}
|
||||
}
|
||||
// set master password
|
||||
if (isset($_POST['masterpassword']) && ($_POST['masterpassword'] != "")) {
|
||||
if ($_POST['masterpassword'] && $_POST['masterpassword2'] && ($_POST['masterpassword'] == $_POST['masterpassword2'])) {
|
||||
|
|
|
@ -42,8 +42,8 @@ include_once('../lib/config.inc');
|
|||
include_once('../lib/status.inc');
|
||||
/** LDAP connection */
|
||||
include_once('../lib/ldap.inc');
|
||||
/** lamdaemon interface */
|
||||
include_once('../lib/lamdaemon.inc');
|
||||
/** remote interface */
|
||||
include_once('../lib/remote.inc');
|
||||
/** module interface */
|
||||
include_once('../lib/modules.inc');
|
||||
|
||||
|
@ -105,7 +105,8 @@ if (isset($_GET['type']) && isset($_SESSION['delete_dn'])) {
|
|||
echo "<b>" . _("Do you really want to remove the following accounts?") . "</b>";
|
||||
echo "<br><br>\n";
|
||||
echo "<table border=0>\n";
|
||||
for ($i=0; $i<count($users); $i++) {
|
||||
$userCount = sizeof($users);
|
||||
for ($i = 0; $i < $userCount; $i++) {
|
||||
echo "<tr>\n";
|
||||
echo "<td><b>" . _("Account name:") . "</b> " . htmlspecialchars($users[$i]) . "</td>\n";
|
||||
echo "<td> <b>" . _('DN') . ":</b> " . htmlspecialchars($_SESSION['delete_dn'][$i]) . "</td>\n";
|
||||
|
@ -173,11 +174,11 @@ if (isset($_POST['delete'])) {
|
|||
// Delete dns
|
||||
$allOk = true;
|
||||
$allErrors = array();
|
||||
for ($m=0; $m<count($_SESSION['delete_dn']); $m++) {
|
||||
foreach ($_SESSION['delete_dn'] as $deleteDN) {
|
||||
// Set to true if an real error has happened
|
||||
$stopprocessing = false;
|
||||
// First load DN.
|
||||
$_SESSION['account']->load_account($_SESSION['delete_dn'][$m]);
|
||||
$_SESSION['account']->load_account($deleteDN);
|
||||
// get commands and changes of each attribute
|
||||
$moduleNames = array_keys($_SESSION['account']->getAccountModules());
|
||||
$modules = $_SESSION['account']->getAccountModules();
|
||||
|
@ -188,13 +189,13 @@ if (isset($_POST['delete'])) {
|
|||
foreach ($moduleNames as $singlemodule) {
|
||||
$success = true;
|
||||
$messages = $modules[$singlemodule]->preDeleteActions();
|
||||
for ($i = 0; $i < sizeof($messages); $i++) {
|
||||
$errors[] = $messages[$i];
|
||||
if ($messages[$i][0] == 'ERROR') {
|
||||
foreach ($messages as $message) {
|
||||
$errors[] = $message;
|
||||
if ($message[0] == 'ERROR') {
|
||||
$success = false;
|
||||
$allOk = false;
|
||||
}
|
||||
elseif ($messages[$i][0] == 'WARN') {
|
||||
elseif ($message[0] == 'WARN') {
|
||||
$allOk = false;
|
||||
}
|
||||
}
|
||||
|
@ -213,20 +214,21 @@ if (isset($_POST['delete'])) {
|
|||
// merge changes
|
||||
$DNs = array_keys($temp);
|
||||
$attributes = array_merge_recursive($temp, $attributes);
|
||||
for ($i=0; $i<count($DNs); $i++) {
|
||||
$ops = array_keys($temp[$DNs[$i]]);
|
||||
for ($j=0; $j<count($ops); $j++) {
|
||||
$attrs = array_keys($temp[$DNs[$i]][$ops[$j]]);
|
||||
for ($k=0; $k<count($attrs); $k++)
|
||||
$attributes[$DNs[$i]][$ops[$j]][$attrs[$k]] = array_unique($attributes[$DNs[$i]][$ops[$j]][$attrs[$k]]);
|
||||
foreach ($DNs as $dn) {
|
||||
$ops = array_keys($temp[$dn]);
|
||||
foreach ($ops as $op) {
|
||||
$attrs = array_keys($temp[$dn][$op]);
|
||||
foreach ($attrs as $attribute) {
|
||||
$attributes[$dn][$op][$attribute] = array_unique($attributes[$dn][$op][$attribute]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$DNs = array_keys($attributes);
|
||||
for ($i=0; $i<count($DNs); $i++) {
|
||||
if (isset($attributes[$DNs[$i]]['errors'])) {
|
||||
foreach ($attributes[$DNs[$i]]['errors'] as $singleerror) {
|
||||
foreach ($DNs as $dn) {
|
||||
if (isset($attributes[$dn]['errors'])) {
|
||||
foreach ($attributes[$dn]['errors'] as $singleerror) {
|
||||
$errors[] = $singleerror;
|
||||
if ($singleerror[0] == 'ERROR') {
|
||||
$stopprocessing = true;
|
||||
|
@ -236,28 +238,28 @@ if (isset($_POST['delete'])) {
|
|||
}
|
||||
if (!$stopprocessing) {
|
||||
// modify attributes
|
||||
if (isset($attributes[$DNs[$i]]['modify']) && !$stopprocessing) {
|
||||
$success = @ldap_mod_replace($_SESSION['ldap']->server(), $DNs[$i], $attributes[$DNs[$i]]['modify']);
|
||||
if (isset($attributes[$dn]['modify']) && !$stopprocessing) {
|
||||
$success = @ldap_mod_replace($_SESSION['ldap']->server(), $dn, $attributes[$dn]['modify']);
|
||||
if (!$success) {
|
||||
$errors[] = array ('ERROR', sprintf(_('Was unable to modify attributes from DN: %s.'), $DNs[$i]), getDefaultLDAPErrorString($_SESSION['ldap']->server()));
|
||||
$errors[] = array ('ERROR', sprintf(_('Was unable to modify attributes from DN: %s.'), $dn), getDefaultLDAPErrorString($_SESSION['ldap']->server()));
|
||||
$stopprocessing = true;
|
||||
$allOk = false;
|
||||
}
|
||||
}
|
||||
// add attributes
|
||||
if (isset($attributes[$DNs[$i]]['add']) && !$stopprocessing) {
|
||||
$success = @ldap_mod_add($_SESSION['ldap']->server(), $DNs[$i], $attributes[$DNs[$i]]['add']);
|
||||
if (isset($attributes[$dn]['add']) && !$stopprocessing) {
|
||||
$success = @ldap_mod_add($_SESSION['ldap']->server(), $dn, $attributes[$dn]['add']);
|
||||
if (!$success) {
|
||||
$errors[] = array ('ERROR', sprintf(_('Was unable to add attributes to DN: %s.'), $DNs[$i]), getDefaultLDAPErrorString($_SESSION['ldap']->server()));
|
||||
$errors[] = array ('ERROR', sprintf(_('Was unable to add attributes to DN: %s.'), $dn), getDefaultLDAPErrorString($_SESSION['ldap']->server()));
|
||||
$stopprocessing = true;
|
||||
$allOk = false;
|
||||
}
|
||||
}
|
||||
// remove attributes
|
||||
if (isset($attributes[$DNs[$i]]['remove']) && !$stopprocessing) {
|
||||
$success = @ldap_mod_del($_SESSION['ldap']->server(), $DNs[$i], $attributes[$DNs[$i]]['remove']);
|
||||
if (isset($attributes[$dn]['remove']) && !$stopprocessing) {
|
||||
$success = @ldap_mod_del($_SESSION['ldap']->server(), $dn, $attributes[$dn]['remove']);
|
||||
if (!$success) {
|
||||
$errors[] = array ('ERROR', sprintf(_('Was unable to remove attributes from DN: %s.'), $DNs[$i]), getDefaultLDAPErrorString($_SESSION['ldap']->server()));
|
||||
$errors[] = array ('ERROR', sprintf(_('Was unable to remove attributes from DN: %s.'), $dn), getDefaultLDAPErrorString($_SESSION['ldap']->server()));
|
||||
$stopprocessing = true;
|
||||
$allOk = false;
|
||||
}
|
||||
|
@ -267,7 +269,7 @@ if (isset($_POST['delete'])) {
|
|||
}
|
||||
if (!$stopprocessing) {
|
||||
$recursive = !$_SESSION['account']->hasOnlyVirtualChildren();
|
||||
$messages = deleteDN($_SESSION['delete_dn'][$m], $recursive);
|
||||
$messages = deleteDN($deleteDN, $recursive);
|
||||
$errors = array_merge($errors, $messages);
|
||||
if (sizeof($errors) > 0) {
|
||||
$stopprocessing = true;
|
||||
|
@ -278,16 +280,16 @@ if (isset($_POST['delete'])) {
|
|||
if (!$stopprocessing) {
|
||||
foreach ($moduleNames as $singlemodule) {
|
||||
$messages = $modules[$singlemodule]->postDeleteActions();
|
||||
for ($i = 0; $i < sizeof($messages); $i++) {
|
||||
$errors[] = $messages[$i];
|
||||
if (($messages[$i][0] == 'ERROR') || ($messages[$i][0] == 'WARN')) {
|
||||
foreach ($messages as $message) {
|
||||
$errors[] = $message;
|
||||
if (($message[0] == 'ERROR') || ($message[0] == 'WARN')) {
|
||||
$allOk = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!$stopprocessing) {
|
||||
echo sprintf(_('Deleted DN: %s'), $_SESSION['delete_dn'][$m]) . "<br>\n";
|
||||
echo sprintf(_('Deleted DN: %s'), $deleteDN) . "<br>\n";
|
||||
foreach ($errors as $error) {
|
||||
call_user_func_array('StatusMessage', $error);
|
||||
}
|
||||
|
@ -295,7 +297,7 @@ if (isset($_POST['delete'])) {
|
|||
flush();
|
||||
}
|
||||
else {
|
||||
echo sprintf(_('Error while deleting DN: %s'), $_SESSION['delete_dn'][$m]) . "<br>\n";
|
||||
echo sprintf(_('Error while deleting DN: %s'), $deleteDN) . "<br>\n";
|
||||
foreach ($errors as $error) {
|
||||
call_user_func_array('StatusMessage', $error);
|
||||
}
|
||||
|
|
|
@ -54,19 +54,19 @@ if (!empty($_POST)) {
|
|||
// check if user already pressed button
|
||||
if (isset($_POST['add_suff']) || isset($_POST['cancel'])) {
|
||||
if (isset($_POST['add_suff'])) {
|
||||
$fail = array();
|
||||
$errors = array();
|
||||
$new_suff = $_POST['new_suff'];
|
||||
$new_suff = str_replace("\\", "", $new_suff);
|
||||
$new_suff = str_replace("'", "", $new_suff);
|
||||
$new_suff = explode(";", $new_suff);
|
||||
$failedDNs = array();
|
||||
$error = array();
|
||||
$newSuffixes = $_POST['new_suff'];
|
||||
$newSuffixes = str_replace("\\", "", $newSuffixes);
|
||||
$newSuffixes = str_replace("'", "", $newSuffixes);
|
||||
$newSuffixes = explode(";", $newSuffixes);
|
||||
// add entries
|
||||
for ($i = 0; $i < sizeof($new_suff); $i++) {
|
||||
foreach ($newSuffixes as $newSuffix) {
|
||||
// check if entry is already present
|
||||
$info = @ldap_read($_SESSION['ldap']->server(), escapeDN($new_suff[$i]), "objectclass=*", array('dn'), 0, 0, 0, LDAP_DEREF_NEVER);
|
||||
$info = @ldap_read($_SESSION['ldap']->server(), escapeDN($newSuffix), "objectclass=*", array('dn'), 0, 0, 0, LDAP_DEREF_NEVER);
|
||||
$res = @ldap_get_entries($_SESSION['ldap']->server(), $info);
|
||||
if ($res) continue;
|
||||
$suff = $new_suff[$i];
|
||||
$suff = $newSuffix;
|
||||
// generate DN and attributes
|
||||
$tmp = explode(",", $suff);
|
||||
$name = explode("=", $tmp[0]);
|
||||
|
@ -78,7 +78,7 @@ if (isset($_POST['add_suff']) || isset($_POST['cancel'])) {
|
|||
$attr['objectClass'] = 'organization';
|
||||
$dn = $suff;
|
||||
if (!@ldap_add($_SESSION['ldap']->server(), $dn, $attr)) {
|
||||
$fail[] = $suff;
|
||||
$failedDNs[] = $suff;
|
||||
$error[] = ldap_error($_SESSION['ldap']->server());
|
||||
continue;
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ if (isset($_POST['add_suff']) || isset($_POST['cancel'])) {
|
|||
$attr['ou'] = $headarray[1];
|
||||
$dn = $subsuffs[$k];
|
||||
if (!@ldap_add($_SESSION['ldap']->server(), $dn, $attr)) {
|
||||
$fail[] = $suff;
|
||||
$failedDNs[] = $suff;
|
||||
$error[] = ldap_error($_SESSION['ldap']->server());
|
||||
break;
|
||||
}
|
||||
|
@ -132,7 +132,7 @@ if (isset($_POST['add_suff']) || isset($_POST['cancel'])) {
|
|||
}
|
||||
$dn = $subsuffs[$k];
|
||||
if (!@ldap_add($_SESSION['ldap']->server(), $dn, $attr)) {
|
||||
$fail[] = $suff;
|
||||
$failedDNs[] = $suff;
|
||||
$error[] = ldap_error($_SESSION['ldap']->server());
|
||||
break;
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ if (isset($_POST['add_suff']) || isset($_POST['cancel'])) {
|
|||
}
|
||||
}
|
||||
else {
|
||||
$fail[] = $suff;
|
||||
$failedDNs[] = $suff;
|
||||
$error[] = ldap_error($_SESSION['ldap']->server());
|
||||
}
|
||||
}
|
||||
|
@ -151,10 +151,10 @@ if (isset($_POST['add_suff']) || isset($_POST['cancel'])) {
|
|||
include 'main_header.php';
|
||||
// print error/success messages
|
||||
if (isset($_POST['add_suff'])) {
|
||||
if (sizeof($fail) > 0) {
|
||||
if (sizeof($failedDNs) > 0) {
|
||||
// print error messages
|
||||
for ($i = 0; $i < sizeof($fail); $i++) {
|
||||
StatusMessage("ERROR", _("Failed to create entry!") . "<br>" . htmlspecialchars($error[$i]), htmlspecialchars($fail[$i]));
|
||||
for ($i = 0; $i < sizeof($failedDNs); $i++) {
|
||||
StatusMessage("ERROR", _("Failed to create entry!") . "<br>" . htmlspecialchars($error[$i]), htmlspecialchars($failedDNs[$i]));
|
||||
}
|
||||
include 'main_footer.php';
|
||||
}
|
||||
|
@ -173,10 +173,10 @@ if (isset($_POST['add_suff']) || isset($_POST['cancel'])) {
|
|||
}
|
||||
|
||||
// first show of page
|
||||
$new_suff = $_GET['suffs'];
|
||||
$new_suff = str_replace("\\", "", $new_suff);
|
||||
$new_suff = str_replace("'", "", $new_suff);
|
||||
$new_suff = explode(";", $new_suff);
|
||||
$newSuffixes = $_GET['suffs'];
|
||||
$newSuffixes = str_replace("\\", "", $newSuffixes);
|
||||
$newSuffixes = str_replace("'", "", $newSuffixes);
|
||||
$newSuffixes = explode(";", $newSuffixes);
|
||||
|
||||
include 'main_header.php';
|
||||
echo '<div class="user-bright smallPaddingContent">';
|
||||
|
@ -186,15 +186,15 @@ include 'main_header.php';
|
|||
$container->addElement(new htmlOutputText(_("You can setup the LDAP suffixes for all account types in your LAM server profile on tab \"Account types\".")), true);
|
||||
$container->addElement(new htmlSpacer(null, '10px'), true);
|
||||
// print missing suffixes
|
||||
for ($i = 0; $i < sizeof($new_suff); $i++) {
|
||||
$container->addElement(new htmlOutputText($new_suff[$i]), true);
|
||||
foreach ($newSuffixes as $newSuffix) {
|
||||
$container->addElement(new htmlOutputText($newSuffix), true);
|
||||
}
|
||||
$container->addElement(new htmlSpacer(null, '10px'), true);
|
||||
|
||||
$buttonContainer = new htmlTable();
|
||||
$buttonContainer->addElement(new htmlButton('add_suff', _("Create")));
|
||||
$buttonContainer->addElement(new htmlButton('cancel', _("Cancel")));
|
||||
$buttonContainer->addElement(new htmlHiddenInput('new_suff', implode(";", $new_suff)));
|
||||
$buttonContainer->addElement(new htmlHiddenInput('new_suff', implode(";", $newSuffixes)));
|
||||
$container->addElement($buttonContainer);
|
||||
addSecurityTokenToMetaHTML($container);
|
||||
|
||||
|
|
|
@ -177,7 +177,7 @@ $_SESSION['header'] .= "<meta http-equiv=\"pragma\" content=\"no-cache\">\n <me
|
|||
* @param \LAM\ENV\LAMLicenseValidator $licenseValidator license validator
|
||||
* @param string $error_message error message to display
|
||||
*/
|
||||
function display_LoginPage($config_object, $cfgMain, $licenseValidator, $error_message) {
|
||||
function display_LoginPage(LAMConfig $config_object, LAMCfgMain $cfgMain, $licenseValidator, $error_message) {
|
||||
logNewMessage(LOG_DEBUG, "Display login page");
|
||||
// generate 256 bit key and initialization vector for user/passwd-encryption
|
||||
if(function_exists('openssl_random_pseudo_bytes') && ($cfgMain->encryptSession == 'true')) {
|
||||
|
@ -582,9 +582,6 @@ if(!empty($_POST['checklogin'])) {
|
|||
display_LoginPage($_SESSION['config'], $_SESSION["cfgMain"], $licenseValidator, $error_message); // Empty password submitted. Return to login page.
|
||||
exit();
|
||||
}
|
||||
if (get_magic_quotes_gpc() == 1) {
|
||||
$_POST['passwd'] = stripslashes($_POST['passwd']);
|
||||
}
|
||||
$username = $_POST['username'];
|
||||
$password = $_POST['passwd'];
|
||||
}
|
||||
|
@ -594,7 +591,7 @@ if(!empty($_POST['checklogin'])) {
|
|||
$searchFilter = str_replace('%USER%', $username ,$searchFilter);
|
||||
$searchDN = '';
|
||||
$searchPassword = '';
|
||||
if (($_SESSION['config']->getLoginSearchDN() != null) && ($_SESSION['config']->getLoginSearchDN() != '')) {
|
||||
if (!empty($_SESSION['config']->getLoginSearchDN())) {
|
||||
$searchDN = $_SESSION['config']->getLoginSearchDN();
|
||||
$searchPassword = $_SESSION['config']->getLoginSearchPassword();
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<?php
|
||||
namespace LAM\AJAX;
|
||||
/*
|
||||
$Id$
|
||||
|
||||
|
@ -47,18 +48,19 @@ if (startSecureSession(false, true) === false) {
|
|||
|
||||
setlanguage();
|
||||
|
||||
lamAjax::handleRequest();
|
||||
$ajax = new Ajax();
|
||||
$ajax->handleRequest();
|
||||
|
||||
/**
|
||||
* Manages all AJAX requests.
|
||||
*/
|
||||
class lamAjax {
|
||||
class Ajax {
|
||||
|
||||
/**
|
||||
* Manages an AJAX request.
|
||||
*/
|
||||
public static function handleRequest() {
|
||||
lamAjax::setHeader();
|
||||
public function handleRequest() {
|
||||
$this->setHeader();
|
||||
// check token
|
||||
validateSecurityToken(false);
|
||||
|
||||
|
@ -84,16 +86,16 @@ class lamAjax {
|
|||
|
||||
$jsonInput = $_POST['jsonInput'];
|
||||
if ($function == 'passwordStrengthCheck') {
|
||||
lamAjax::checkPasswordStrength($jsonInput);
|
||||
$this->checkPasswordStrength($jsonInput);
|
||||
}
|
||||
enforceUserIsLoggedIn();
|
||||
if ($function == 'passwordChange') {
|
||||
lamAjax::managePasswordChange($jsonInput);
|
||||
$this->managePasswordChange($jsonInput);
|
||||
}
|
||||
elseif ($function == 'upload') {
|
||||
include_once('../../lib/upload.inc');
|
||||
$typeManager = new \LAM\TYPES\TypeManager();
|
||||
$uploader = new LAM\UPLOAD\Uploader($typeManager->getConfiguredType($_GET['typeId']));
|
||||
$uploader = new \LAM\UPLOAD\Uploader($typeManager->getConfiguredType($_GET['typeId']));
|
||||
ob_start();
|
||||
$jsonOut = $uploader->doUpload();
|
||||
ob_end_clean();
|
||||
|
@ -115,7 +117,7 @@ class lamAjax {
|
|||
*
|
||||
* @param array $input input parameters
|
||||
*/
|
||||
public static function managePasswordChange($input) {
|
||||
private static function managePasswordChange($input) {
|
||||
$return = $_SESSION['account']->setNewPassword($input);
|
||||
echo json_encode($return);
|
||||
}
|
||||
|
@ -125,7 +127,7 @@ class lamAjax {
|
|||
*
|
||||
* @param array $input input parameters
|
||||
*/
|
||||
public static function checkPasswordStrength($input) {
|
||||
private function checkPasswordStrength($input) {
|
||||
$password = $input['password'];
|
||||
$result = checkPasswordStrength($password, null, null);
|
||||
echo json_encode(array("result" => $result));
|
||||
|
|
|
@ -81,7 +81,7 @@ if (isset($_POST['createOU']) || isset($_POST['deleteOU'])) {
|
|||
// check if ou already exists
|
||||
$new_dn = "ou=" . $_POST['newOU'] . "," . $_POST['parentOU'];
|
||||
$found = ldapGetDN($new_dn);
|
||||
if ($found == null) {
|
||||
if ($found === null) {
|
||||
// add new ou
|
||||
$ou = array();
|
||||
$ou['objectClass'] = "organizationalunit";
|
||||
|
|
|
@ -15,6 +15,7 @@ use \htmlInputFileUpload;
|
|||
use \htmlHelpLink;
|
||||
use \htmlInputField;
|
||||
use \htmlHiddenInput;
|
||||
use \LAM\TYPES\TypeManager;
|
||||
/*
|
||||
$Id$
|
||||
|
||||
|
@ -89,7 +90,7 @@ if(isset($_POST['createNewTemplate'])) {
|
|||
exit();
|
||||
}
|
||||
|
||||
$typeManager = new \LAM\TYPES\TypeManager();
|
||||
$typeManager = new TypeManager();
|
||||
$types = $typeManager->getConfiguredTypes();
|
||||
$sortedTypes = array();
|
||||
foreach ($types as $type) {
|
||||
|
@ -141,7 +142,7 @@ if (!empty($_POST['import'])) {
|
|||
}
|
||||
$errMessage = importStructures($_POST['typeId'], $options, $serverProfiles, $typeManager);
|
||||
}
|
||||
if ($errMessage != null) {
|
||||
if ($errMessage !== null) {
|
||||
$errMessage->colspan = 10;
|
||||
$container->addElement($errMessage, true);
|
||||
}
|
||||
|
@ -166,7 +167,7 @@ if (!empty($_POST['export'])) {
|
|||
$name = $_POST['name_' . $typeId];
|
||||
$errMessage = exportStructures($typeId, $name, $options, $serverProfiles, $typeManager);
|
||||
}
|
||||
if ($errMessage != null) {
|
||||
if ($errMessage !== null) {
|
||||
$errMessage->colspan = 10;
|
||||
$container->addElement($errMessage, true);
|
||||
}
|
||||
|
@ -195,23 +196,18 @@ foreach ($sortedTypes as $typeId => $title) {
|
|||
'scope' => $type->getScope(),
|
||||
'title' => $title,
|
||||
'icon' => $type->getIcon(),
|
||||
'templates' => "");
|
||||
'templates' => \LAM\PDF\getPDFStructures($type->getId()));
|
||||
$availableTypes[$title] = $type->getId();
|
||||
}
|
||||
// get list of templates for each account type
|
||||
for ($i = 0; $i < sizeof($templateClasses); $i++) {
|
||||
$templateClasses[$i]['templates'] = \LAM\PDF\getPDFStructures($templateClasses[$i]['typeId']);
|
||||
}
|
||||
|
||||
// check if a template should be edited
|
||||
for ($i = 0; $i < sizeof($templateClasses); $i++) {
|
||||
if (isset($_POST['editTemplate_' . $templateClasses[$i]['typeId']]) || isset($_POST['editTemplate_' . $templateClasses[$i]['typeId'] . '_x'])) {
|
||||
metaRefresh('pdfpage.php?type=' . htmlspecialchars($templateClasses[$i]['typeId']) . '&edit=' . htmlspecialchars($_POST['template_' . $templateClasses[$i]['typeId']]));
|
||||
foreach ($templateClasses as $templateClass) {
|
||||
if (isset($_POST['editTemplate_' . $templateClass['typeId']]) || isset($_POST['editTemplate_' . $templateClass['typeId'] . '_x'])) {
|
||||
metaRefresh('pdfpage.php?type=' . htmlspecialchars($templateClass['typeId']) . '&edit=' . htmlspecialchars($_POST['template_' . $templateClass['typeId']]));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
include '../main_header.php';
|
||||
|
||||
?>
|
||||
<div class="user-bright smallPaddingContent">
|
||||
<form enctype="multipart/form-data" action="pdfmain.php" method="post" name="pdfmainForm" >
|
||||
|
@ -246,38 +242,38 @@ include '../main_header.php';
|
|||
// existing templates
|
||||
$container->addElement(new htmlSubTitle(_("Manage existing PDF structures")), true);
|
||||
$existingContainer = new htmlTable();
|
||||
for ($i = 0; $i < sizeof($templateClasses); $i++) {
|
||||
foreach ($templateClasses as $templateClass) {
|
||||
if ($i > 0) {
|
||||
$existingContainer->addElement(new htmlSpacer(null, '10px'), true);
|
||||
}
|
||||
|
||||
$existingContainer->addElement(new htmlImage('../../graphics/' . $templateClasses[$i]['icon']));
|
||||
$existingContainer->addElement(new htmlImage('../../graphics/' . $templateClass['icon']));
|
||||
$existingContainer->addElement(new htmlSpacer('3px', null));
|
||||
$existingContainer->addElement(new htmlOutputText($templateClasses[$i]['title']));
|
||||
$existingContainer->addElement(new htmlOutputText($templateClass['title']));
|
||||
$existingContainer->addElement(new htmlSpacer('3px', null));
|
||||
$select = new htmlSelect('template_' . $templateClasses[$i]['typeId'], $templateClasses[$i]['templates']);
|
||||
$select = new htmlSelect('template_' . $templateClass['typeId'], $templateClass['templates']);
|
||||
$select->setWidth('15em');
|
||||
$existingContainer->addElement($select);
|
||||
$existingContainer->addElement(new htmlSpacer('3px', null));
|
||||
$exEditButton = new htmlButton('editTemplate_' . $templateClasses[$i]['typeId'], 'edit.png', true);
|
||||
$exEditButton = new htmlButton('editTemplate_' . $templateClass['typeId'], 'edit.png', true);
|
||||
$exEditButton->setTitle(_('Edit'));
|
||||
$existingContainer->addElement($exEditButton);
|
||||
$deleteLink = new htmlLink(null, '#', '../../graphics/delete.png');
|
||||
$deleteLink->setTitle(_('Delete'));
|
||||
$deleteLink->setOnClick("profileShowDeleteDialog('" . _('Delete') . "', '" . _('Ok') . "', '" . _('Cancel') . "', '" . $templateClasses[$i]['typeId'] . "', '" . 'template_' . $templateClasses[$i]['typeId'] . "');");
|
||||
$deleteLink->setOnClick("profileShowDeleteDialog('" . _('Delete') . "', '" . _('Ok') . "', '" . _('Cancel') . "', '" . $templateClass['typeId'] . "', '" . 'template_' . $templateClass['typeId'] . "');");
|
||||
$existingContainer->addElement($deleteLink);
|
||||
|
||||
if (count($configProfiles) > 1) {
|
||||
$importLink = new htmlLink(null, '#', '../../graphics/import.png');
|
||||
$importLink->setTitle(_('Import PDF structures'));
|
||||
$importLink->setOnClick("showDistributionDialog('" . _("Import PDF structures") . "', '" .
|
||||
_('Ok') . "', '" . _('Cancel') . "', '" . $templateClasses[$i]['typeId'] . "', 'import');");
|
||||
_('Ok') . "', '" . _('Cancel') . "', '" . $templateClass['typeId'] . "', 'import');");
|
||||
$existingContainer->addElement($importLink);
|
||||
}
|
||||
$exportLink = new htmlLink(null, '#', '../../graphics/export.png');
|
||||
$exportLink->setTitle(_('Export PDF structure'));
|
||||
$exportLink->setOnClick("showDistributionDialog('" . _("Export PDF structure") . "', '" .
|
||||
_('Ok') . "', '" . _('Cancel') . "', '" . $templateClasses[$i]['typeId'] . "', 'export', '" . 'template_' . $templateClasses[$i]['typeId'] . "', '" . $_SESSION['config']->getName() . "');");
|
||||
_('Ok') . "', '" . _('Cancel') . "', '" . $templateClass['typeId'] . "', 'export', '" . 'template_' . $templateClass['typeId'] . "', '" . $_SESSION['config']->getName() . "');");
|
||||
$existingContainer->addElement($exportLink);
|
||||
$existingContainer->addNewLine();
|
||||
}
|
||||
|
@ -314,12 +310,12 @@ include '../main_header.php';
|
|||
echo "</form>\n";
|
||||
echo "</div>\n";
|
||||
|
||||
for ($i = 0; $i < sizeof($templateClasses); $i++) {
|
||||
$typeId = $templateClasses[$i]['typeId'];
|
||||
$scope = $templateClasses[$i]['scope'];
|
||||
foreach ($templateClasses as $templateClass) {
|
||||
$typeId = $templateClass['typeId'];
|
||||
$scope = $templateClass['scope'];
|
||||
$importOptions = array();
|
||||
foreach ($configProfiles as $profile) {
|
||||
$typeManagerImport = new \LAM\TYPES\TypeManager($serverProfiles[$profile]);
|
||||
$typeManagerImport = new TypeManager($serverProfiles[$profile]);
|
||||
$typesImport = $typeManagerImport->getConfiguredTypesForScope($scope);
|
||||
foreach ($typesImport as $typeImport) {
|
||||
if (($profile != $_SESSION['config']->getName()) || ($typeImport->getId() != $typeId)) {
|
||||
|
@ -374,7 +370,7 @@ include '../main_header.php';
|
|||
$container->addElement(new htmlOutputText(_("Target server profile")), true);
|
||||
$exportOptions = array();
|
||||
foreach ($configProfiles as $profile) {
|
||||
$typeManagerExport = new \LAM\TYPES\TypeManager($serverProfiles[$profile]);
|
||||
$typeManagerExport = new TypeManager($serverProfiles[$profile]);
|
||||
$typesExport = $typeManagerExport->getConfiguredTypesForScope($scope);
|
||||
foreach ($typesExport as $typeExport) {
|
||||
if (($profile != $_SESSION['config']->getName()) || ($typeExport->getId() != $typeId)) {
|
||||
|
@ -430,18 +426,18 @@ include '../main_footer.php';
|
|||
* @param string $typeId type id
|
||||
* @param array $options options
|
||||
* @param \LAMConfig[] $serverProfiles server profiles (name => profile object)
|
||||
* @param \LAM\TYPES\TypeManager $typeManager type manager
|
||||
* @param TypeManager $typeManager type manager
|
||||
* @return \htmlStatusMessage message or null
|
||||
*/
|
||||
function importStructures($typeId, $options, &$serverProfiles, &$typeManager) {
|
||||
function importStructures($typeId, $options, &$serverProfiles, TypeManager &$typeManager) {
|
||||
foreach ($options as $option) {
|
||||
$sourceConfName = $option['conf'];
|
||||
$sourceTypeId = $option['typeId'];
|
||||
$sourceName = $option['name'];
|
||||
$sourceTypeManager = new \LAM\TYPES\TypeManager($serverProfiles[$sourceConfName]);
|
||||
$sourceTypeManager = new TypeManager($serverProfiles[$sourceConfName]);
|
||||
$sourceType = $sourceTypeManager->getConfiguredType($sourceTypeId);
|
||||
$targetType = $typeManager->getConfiguredType($typeId);
|
||||
if (($sourceType != null) && ($targetType != null)) {
|
||||
if (($sourceType !== null) && ($targetType !== null)) {
|
||||
try {
|
||||
\LAM\PDF\copyStructure($sourceType, $sourceName, $targetType);
|
||||
}
|
||||
|
@ -460,12 +456,12 @@ function importStructures($typeId, $options, &$serverProfiles, &$typeManager) {
|
|||
* @param string $name profile name
|
||||
* @param array $options options
|
||||
* @param \LAMConfig[] $serverProfiles server profiles (name => profile object)
|
||||
* @param \LAM\TYPES\TypeManager $typeManager type manager
|
||||
* @param TypeManager $typeManager type manager
|
||||
* @return \htmlStatusMessage message or null
|
||||
*/
|
||||
function exportStructures($typeId, $name, $options, &$serverProfiles, &$typeManager) {
|
||||
function exportStructures($typeId, $name, $options, &$serverProfiles, TypeManager &$typeManager) {
|
||||
$sourceType = $typeManager->getConfiguredType($typeId);
|
||||
if ($sourceType == null) {
|
||||
if ($sourceType === null) {
|
||||
return null;
|
||||
}
|
||||
foreach ($options as $option) {
|
||||
|
@ -480,9 +476,9 @@ function exportStructures($typeId, $name, $options, &$serverProfiles, &$typeMana
|
|||
}
|
||||
else {
|
||||
$targetTypeId = $option['typeId'];
|
||||
$targetTypeManager = new \LAM\TYPES\TypeManager($serverProfiles[$targetConfName]);
|
||||
$targetTypeManager = new TypeManager($serverProfiles[$targetConfName]);
|
||||
$targetType = $targetTypeManager->getConfiguredType($targetTypeId);
|
||||
if ($targetType != null) {
|
||||
if ($targetType !== null) {
|
||||
try {
|
||||
\LAM\PDF\copyStructure($sourceType, $name, $targetType);
|
||||
}
|
||||
|
|
|
@ -496,7 +496,7 @@ function translateFieldIDToName($id, $scope, $availablePDFFields) {
|
|||
*
|
||||
* @param PDFStructure $structure
|
||||
*/
|
||||
function updateBasicSettings(&$structure) {
|
||||
function updateBasicSettings(PDFStructure &$structure) {
|
||||
// set headline
|
||||
if (isset($_POST['headline'])) {
|
||||
$structure->setTitle(str_replace('<', '', str_replace('>', '', $_POST['headline'])));
|
||||
|
@ -516,7 +516,7 @@ function updateBasicSettings(&$structure) {
|
|||
*
|
||||
* @param PDFStructure $structure
|
||||
*/
|
||||
function updateSectionTitles(&$structure) {
|
||||
function updateSectionTitles(PDFStructure &$structure) {
|
||||
$sections = $structure->getSections();
|
||||
foreach ($_POST as $key => $value) {
|
||||
if (strpos($key, 'section_') === 0) {
|
||||
|
@ -531,7 +531,7 @@ function updateSectionTitles(&$structure) {
|
|||
*
|
||||
* @param PDFStructure $structure
|
||||
*/
|
||||
function addSection(&$structure) {
|
||||
function addSection(PDFStructure &$structure) {
|
||||
$sections = $structure->getSections();
|
||||
// add a new text field
|
||||
if(isset($_POST['add_text'])) {
|
||||
|
@ -570,7 +570,7 @@ function addSection(&$structure) {
|
|||
*
|
||||
* @param PDFStructure $structure
|
||||
*/
|
||||
function addSectionEntry(&$structure) {
|
||||
function addSectionEntry(PDFStructure &$structure) {
|
||||
if(isset($_POST['add_new_field'])) {
|
||||
$field = new PDFSectionEntry($_POST['new_field']);
|
||||
$sections = $structure->getSections();
|
||||
|
@ -587,7 +587,7 @@ function addSectionEntry(&$structure) {
|
|||
*
|
||||
* @param PDFStructure $structure
|
||||
*/
|
||||
function removeItem(&$structure) {
|
||||
function removeItem(PDFStructure &$structure) {
|
||||
$sections = $structure->getSections();
|
||||
foreach ($_POST as $key => $value) {
|
||||
// remove section
|
||||
|
@ -617,7 +617,7 @@ function removeItem(&$structure) {
|
|||
*
|
||||
* @param PDFStructure $structure
|
||||
*/
|
||||
function moveUp(&$structure) {
|
||||
function moveUp(PDFStructure &$structure) {
|
||||
$sections = $structure->getSections();
|
||||
foreach ($_POST as $key => $value) {
|
||||
// move section
|
||||
|
@ -649,7 +649,7 @@ function moveUp(&$structure) {
|
|||
*
|
||||
* @param PDFStructure $structure
|
||||
*/
|
||||
function moveDown(&$structure) {
|
||||
function moveDown(PDFStructure &$structure) {
|
||||
$sections = $structure->getSections();
|
||||
foreach ($_POST as $key => $value) {
|
||||
// move section
|
||||
|
|
|
@ -14,6 +14,7 @@ use \htmlOutputText;
|
|||
use \htmlHelpLink;
|
||||
use \htmlHiddenInput;
|
||||
use \htmlInputField;
|
||||
use \LAM\TYPES\TypeManager;
|
||||
/*
|
||||
$Id$
|
||||
|
||||
|
@ -67,7 +68,7 @@ if (!empty($_POST)) {
|
|||
validateSecurityToken();
|
||||
}
|
||||
|
||||
$typeManager = new \LAM\TYPES\TypeManager();
|
||||
$typeManager = new TypeManager();
|
||||
$types = $typeManager->getConfiguredTypes();
|
||||
$profileClasses = array();
|
||||
$profileClassesTemp = array();
|
||||
|
@ -158,7 +159,7 @@ if (!empty($_POST['import'])) {
|
|||
}
|
||||
$errMessage = importProfiles($_POST['typeId'], $options, $serverProfiles, $typeManager);
|
||||
}
|
||||
if ($errMessage != null) {
|
||||
if ($errMessage !== null) {
|
||||
$errMessage->colspan = 10;
|
||||
$container->addElement($errMessage, true);
|
||||
}
|
||||
|
@ -181,7 +182,7 @@ if (!empty($_POST['export'])) {
|
|||
$name = $_POST['name_' . $typeId];
|
||||
$errMessage = exportProfiles($typeId, $name, $options, $serverProfiles, $typeManager);
|
||||
}
|
||||
if ($errMessage != null) {
|
||||
if ($errMessage !== null) {
|
||||
$errMessage->colspan = 10;
|
||||
$container->addElement($errMessage, true);
|
||||
}
|
||||
|
@ -274,7 +275,7 @@ for ($i = 0; $i < sizeof($profileClasses); $i++) {
|
|||
$scope = $profileClasses[$i]['scope'];
|
||||
$importOptions = array();
|
||||
foreach ($configProfiles as $profile) {
|
||||
$typeManagerImport = new \LAM\TYPES\TypeManager($serverProfiles[$profile]);
|
||||
$typeManagerImport = new TypeManager($serverProfiles[$profile]);
|
||||
$typesImport = $typeManagerImport->getConfiguredTypesForScope($scope);
|
||||
foreach ($typesImport as $typeImport) {
|
||||
if (($profile != $_SESSION['config']->getName()) || ($typeImport->getId() != $typeId)) {
|
||||
|
@ -329,7 +330,7 @@ for ($i = 0; $i < sizeof($profileClasses); $i++) {
|
|||
$container->addElement(new htmlOutputText(_("Target server profile")), true);
|
||||
$exportOptions = array();
|
||||
foreach ($configProfiles as $profile) {
|
||||
$typeManagerExport = new \LAM\TYPES\TypeManager($serverProfiles[$profile]);
|
||||
$typeManagerExport = new TypeManager($serverProfiles[$profile]);
|
||||
$typesExport = $typeManagerExport->getConfiguredTypesForScope($scope);
|
||||
foreach ($typesExport as $typeExport) {
|
||||
if (($profile != $_SESSION['config']->getName()) || ($typeExport->getId() != $typeId)) {
|
||||
|
@ -385,18 +386,18 @@ include '../main_footer.php';
|
|||
* @param string $typeId type id
|
||||
* @param array $options options
|
||||
* @param \LAMConfig[] $serverProfiles server profiles (name => profile object)
|
||||
* @param \LAM\TYPES\TypeManager $typeManager type manager
|
||||
* @param TypeManager $typeManager type manager
|
||||
* @return \htmlStatusMessage message or null
|
||||
*/
|
||||
function importProfiles($typeId, $options, &$serverProfiles, &$typeManager) {
|
||||
function importProfiles($typeId, $options, &$serverProfiles, TypeManager &$typeManager) {
|
||||
foreach ($options as $option) {
|
||||
$sourceConfName = $option['conf'];
|
||||
$sourceTypeId = $option['typeId'];
|
||||
$sourceName = $option['name'];
|
||||
$sourceTypeManager = new \LAM\TYPES\TypeManager($serverProfiles[$sourceConfName]);
|
||||
$sourceTypeManager = new TypeManager($serverProfiles[$sourceConfName]);
|
||||
$sourceType = $sourceTypeManager->getConfiguredType($sourceTypeId);
|
||||
$targetType = $typeManager->getConfiguredType($typeId);
|
||||
if (($sourceType != null) && ($targetType != null)) {
|
||||
if (($sourceType !== null) && ($targetType !== null)) {
|
||||
try {
|
||||
\LAM\PROFILES\copyAccountProfile($sourceType, $sourceName, $targetType);
|
||||
}
|
||||
|
@ -415,12 +416,12 @@ function importProfiles($typeId, $options, &$serverProfiles, &$typeManager) {
|
|||
* @param string $name profile name
|
||||
* @param array $options options
|
||||
* @param \LAMConfig[] $serverProfiles server profiles (name => profile object)
|
||||
* @param \LAM\TYPES\TypeManager $typeManager type manager
|
||||
* @param TypeManager $typeManager type manager
|
||||
* @return \htmlStatusMessage message or null
|
||||
*/
|
||||
function exportProfiles($typeId, $name, $options, &$serverProfiles, &$typeManager) {
|
||||
function exportProfiles($typeId, $name, $options, &$serverProfiles, TypeManager &$typeManager) {
|
||||
$sourceType = $typeManager->getConfiguredType($typeId);
|
||||
if ($sourceType == null) {
|
||||
if ($sourceType === null) {
|
||||
return null;
|
||||
}
|
||||
foreach ($options as $option) {
|
||||
|
@ -435,9 +436,9 @@ function exportProfiles($typeId, $name, $options, &$serverProfiles, &$typeManage
|
|||
}
|
||||
else {
|
||||
$targetTypeId = $option['typeId'];
|
||||
$targetTypeManager = new \LAM\TYPES\TypeManager($serverProfiles[$targetConfName]);
|
||||
$targetTypeManager = new TypeManager($serverProfiles[$targetConfName]);
|
||||
$targetType = $targetTypeManager->getConfiguredType($targetTypeId);
|
||||
if ($targetType != null) {
|
||||
if ($targetType !== null) {
|
||||
try {
|
||||
\LAM\PROFILES\copyAccountProfile($sourceType, $name, $targetType);
|
||||
}
|
||||
|
|
|
@ -125,13 +125,6 @@ if (isset($_POST['save'])) {
|
|||
}
|
||||
}
|
||||
|
||||
// remove double slashes if magic quotes are on
|
||||
if (get_magic_quotes_gpc() == 1) {
|
||||
foreach ($opt_keys as $element) {
|
||||
if (isset($options[$element][0]) && is_string($options[$element][0])) $options[$element][0] = stripslashes($options[$element][0]);
|
||||
}
|
||||
}
|
||||
|
||||
// check options
|
||||
$errors = checkProfileOptions($_POST['accounttype'], $options);
|
||||
if (sizeof($errors) == 0) { // input data is valid, save profile
|
||||
|
@ -169,12 +162,7 @@ if (isset($_POST['save'])) {
|
|||
$postKeys = array_keys($_POST);
|
||||
for ($i = 0; $i < sizeof($postKeys); $i++) {
|
||||
if (!is_array($_POST[$postKeys[$i]])) {
|
||||
if (get_magic_quotes_gpc() == 1) {
|
||||
$old_options[$postKeys[$i]] = array(stripslashes($_POST[$postKeys[$i]]));
|
||||
}
|
||||
else {
|
||||
$old_options[$postKeys[$i]] = array($_POST[$postKeys[$i]]);
|
||||
}
|
||||
$old_options[$postKeys[$i]] = array($_POST[$postKeys[$i]]);
|
||||
}
|
||||
else {
|
||||
$old_options[$postKeys[$i]] = $_POST[$postKeys[$i]];
|
||||
|
@ -241,7 +229,7 @@ for ($m = 0; $m < sizeof($modules); $m++) {
|
|||
if (sizeof($options[$modules[$m]]) < 1) continue;
|
||||
$module = new $modules[$m]($type->getScope());
|
||||
$icon = $module->getIcon();
|
||||
if (($icon != null) && !(strpos($icon, 'http') === 0) && !(strpos($icon, '/') === 0)) {
|
||||
if (!empty($icon) && !(strpos($icon, 'http') === 0) && !(strpos($icon, '/') === 0)) {
|
||||
$icon = '../../graphics/' . $icon;
|
||||
}
|
||||
$container = new htmlTable();
|
||||
|
|
|
@ -1,4 +1,18 @@
|
|||
<?php
|
||||
namespace LAM\TOOLS\TESTS;
|
||||
use \LAM\REMOTE\Remote;
|
||||
use \htmlTable;
|
||||
use \htmlTitle;
|
||||
use \htmlOutputText;
|
||||
use \htmlSelect;
|
||||
use \htmlInputCheckbox;
|
||||
use \htmlSpacer;
|
||||
use \htmlButton;
|
||||
use \htmlStatusMessage;
|
||||
use \htmlImage;
|
||||
use \htmlSubTitle;
|
||||
use \Exception;
|
||||
|
||||
/*
|
||||
$Id$
|
||||
|
||||
|
@ -22,7 +36,7 @@ $Id$
|
|||
*/
|
||||
|
||||
/**
|
||||
* Tests the lamdaemon script.
|
||||
* Tests the remote script.
|
||||
*
|
||||
* @author Roland Gruber
|
||||
* @author Thomas Manninger
|
||||
|
@ -67,7 +81,7 @@ for ($i = 0; $i < sizeof($servers); $i++) {
|
|||
}
|
||||
|
||||
if (isset($_POST['runTest'])) {
|
||||
lamRunLamdaemonTestSuite($_POST['server'], $serverTitles[$_POST['server']] , isset($_POST['checkQuotas']), $container);
|
||||
lamRunTestSuite($_POST['server'], $serverTitles[$_POST['server']] , isset($_POST['checkQuotas']), $container);
|
||||
}
|
||||
else if ((sizeof($servers) > 0) && isset($servers[0]) && ($servers[0] != '')) {
|
||||
$container->addElement(new htmlOutputText(_("Server")));
|
||||
|
@ -111,22 +125,22 @@ include '../main_footer.php';
|
|||
*
|
||||
* @param string $command test command
|
||||
* @param boolean $stopTest specifies if test should be run
|
||||
* @param connection $handle SSH connection
|
||||
* @param Remote $remote SSH connection
|
||||
* @param string $testText describing text
|
||||
* @param htmlTable $container container for HTML output
|
||||
* @return boolean true, if errors occured
|
||||
*/
|
||||
function lamTestLamdaemon($command, $stopTest, $handle, $testText, $container) {
|
||||
function testRemoteCommand($command, $stopTest, $remote, $testText, $container) {
|
||||
$okImage = "../../graphics/pass.png";
|
||||
$failImage = "../../graphics/fail.png";
|
||||
$spacer = new htmlSpacer('10px', null);
|
||||
// run lamdaemon and get user quotas
|
||||
// run remote command
|
||||
if (!$stopTest) {
|
||||
$container->addElement(new htmlOutputText($testText));
|
||||
$container->addElement($spacer);
|
||||
flush();
|
||||
$lamdaemonOk = false;
|
||||
$output = $handle->exec("sudo " . $_SESSION['config']->get_scriptPath() . ' ' . escapeshellarg($command));
|
||||
$output = $remote->execute($command);
|
||||
if ((stripos(strtolower($output), "error") === false) && ((strpos($output, 'INFO,') === 0) || (strpos($output, 'QUOTA_ENTRY') === 0))) {
|
||||
$lamdaemonOk = true;
|
||||
}
|
||||
|
@ -170,7 +184,7 @@ function lamTestLamdaemon($command, $stopTest, $handle, $testText, $container) {
|
|||
* @param boolean $testQuota true, if Quotas should be checked
|
||||
* @param htmlTable $container container for HTML output
|
||||
*/
|
||||
function lamRunLamdaemonTestSuite($serverName, $serverTitle, $testQuota, $container) {
|
||||
function lamRunTestSuite($serverName, $serverTitle, $testQuota, $container) {
|
||||
$SPLIT_DELIMITER = "###x##y##x###";
|
||||
$LAMDAEMON_PROTOCOL_VERSION = '5';
|
||||
$okImage = "../../graphics/pass.png";
|
||||
|
@ -246,13 +260,14 @@ function lamRunLamdaemonTestSuite($serverName, $serverTitle, $testQuota, $contai
|
|||
flush();
|
||||
|
||||
// check SSH login
|
||||
$remote = new Remote();
|
||||
if (!$stopTest) {
|
||||
$container->addElement(new htmlOutputText(_("SSH connection")));
|
||||
$container->addElement($spacer);
|
||||
flush();
|
||||
$sshOk = false;
|
||||
try {
|
||||
$handle = lamConnectSSH($serverName);
|
||||
$remote->connect($serverName);
|
||||
$container->addElement(new htmlImage($okImage));
|
||||
$container->addElement($spacer);
|
||||
$container->addElement(new htmlOutputText(_("SSH connection established.")), true);
|
||||
|
@ -268,23 +283,21 @@ function lamRunLamdaemonTestSuite($serverName, $serverTitle, $testQuota, $contai
|
|||
flush();
|
||||
|
||||
if (!$stopTest) {
|
||||
$stopTest = lamTestLamdaemon("+" . $SPLIT_DELIMITER . "test" . $SPLIT_DELIMITER . "basic", $stopTest, $handle, _("Execute lamdaemon"), $container);
|
||||
$stopTest = testRemoteCommand("+" . $SPLIT_DELIMITER . "test" . $SPLIT_DELIMITER . "basic", $stopTest, $remote, _("Execute lamdaemon"), $container);
|
||||
}
|
||||
|
||||
if (!$stopTest) {
|
||||
$stopTest = lamTestLamdaemon("+" . $SPLIT_DELIMITER . "test" . $SPLIT_DELIMITER . "version" . $SPLIT_DELIMITER . $LAMDAEMON_PROTOCOL_VERSION, $stopTest, $handle, _("Lamdaemon version"), $container);
|
||||
$stopTest = testRemoteCommand("+" . $SPLIT_DELIMITER . "test" . $SPLIT_DELIMITER . "version" . $SPLIT_DELIMITER . $LAMDAEMON_PROTOCOL_VERSION, $stopTest, $remote, _("Lamdaemon version"), $container);
|
||||
}
|
||||
|
||||
if (!$stopTest) {
|
||||
$handle = lamConnectSSH($serverName);
|
||||
$stopTest = lamTestLamdaemon("+" . $SPLIT_DELIMITER . "test" . $SPLIT_DELIMITER . "nss" . $SPLIT_DELIMITER . "$userName", $stopTest, $handle, _("Lamdaemon: check NSS LDAP"), $container);
|
||||
$stopTest = testRemoteCommand("+" . $SPLIT_DELIMITER . "test" . $SPLIT_DELIMITER . "nss" . $SPLIT_DELIMITER . "$userName", $stopTest, $remote, _("Lamdaemon: check NSS LDAP"), $container);
|
||||
if (!$stopTest && $testQuota) {
|
||||
$handle = lamConnectSSH($serverName);
|
||||
$stopTest = lamTestLamdaemon("+" . $SPLIT_DELIMITER . "test" . $SPLIT_DELIMITER . "quota", $stopTest, $handle, _("Lamdaemon: Quota module installed"), $container);
|
||||
$handle = lamConnectSSH($serverName);
|
||||
$stopTest = lamTestLamdaemon("+" . $SPLIT_DELIMITER . "quota" . $SPLIT_DELIMITER . "get" . $SPLIT_DELIMITER . "user", $stopTest, $handle, _("Lamdaemon: read quotas"), $container);
|
||||
$stopTest = testRemoteCommand("+" . $SPLIT_DELIMITER . "test" . $SPLIT_DELIMITER . "quota", $stopTest, $remote, _("Lamdaemon: Quota module installed"), $container);
|
||||
$stopTest = testRemoteCommand("+" . $SPLIT_DELIMITER . "quota" . $SPLIT_DELIMITER . "get" . $SPLIT_DELIMITER . "user", $stopTest, $remote, _("Lamdaemon: read quotas"), $container);
|
||||
}
|
||||
}
|
||||
$remote->disconnect();
|
||||
|
||||
$container->addElement(new htmlSpacer(null, '10px'), true);
|
||||
$endMessage = new htmlOutputText(_("Lamdaemon test finished."));
|
||||
|
|
|
@ -140,7 +140,7 @@ if ($_FILES['inputfile'] && ($_FILES['inputfile']['size'] > 0)) {
|
|||
$checkcolumns = array();
|
||||
$columns = call_user_func_array('array_merge', $columns);
|
||||
for ($i = 0; $i < sizeof($columns); $i++) {
|
||||
if (isset($columns[$i]['required']) && ($columns[$i]['required'] == true)) {
|
||||
if (isset($columns[$i]['required']) && ($columns[$i]['required'] === true)) {
|
||||
if (isset($ids[$columns[$i]['name']])) $checkcolumns[] = $ids[$columns[$i]['name']];
|
||||
else $errors[] = array(_("A required column is missing in your CSV file."), $columns[$i]['name']);
|
||||
}
|
||||
|
@ -201,7 +201,7 @@ if ($_FILES['inputfile'] && ($_FILES['inputfile']['size'] > 0)) {
|
|||
// let modules build accounts
|
||||
else {
|
||||
$accounts = buildUploadAccounts($type, $data, $ids, $selectedModules);
|
||||
if ($accounts != false) {
|
||||
if ($accounts !== false) {
|
||||
$rdnList = getRDNAttributes($type->getId(), $selectedModules);
|
||||
$suffix = $type->getSuffix();
|
||||
// set DN
|
||||
|
@ -282,7 +282,7 @@ include '../main_footer.php';
|
|||
* @param array $selectedModules selected modules for upload
|
||||
* @param htmlTable $container table container
|
||||
*/
|
||||
function massPrintBackButton($typeId, $selectedModules, &$container) {
|
||||
function massPrintBackButton($typeId, $selectedModules, htmlTable &$container) {
|
||||
$backButton = new htmlButton('submit', _('Back'));
|
||||
$backButton->setIconClass('backButton');
|
||||
$container->addElement($backButton);
|
||||
|
|
|
@ -256,7 +256,7 @@ include '../main_footer.php';
|
|||
* @param \LAM\TYPES\ConfiguredType $type account type
|
||||
* @param array $selectedModules list of selected account modules
|
||||
*/
|
||||
function showMainPage($type, $selectedModules) {
|
||||
function showMainPage(\LAM\TYPES\ConfiguredType $type, $selectedModules) {
|
||||
$scope = $type->getScope();
|
||||
echo '<div class="' . $scope . '-bright smallPaddingContent">';
|
||||
// get input fields from modules
|
||||
|
@ -382,7 +382,7 @@ function showMainPage($type, $selectedModules) {
|
|||
$columnContainer->addElement(new htmlSpacer(null, '10px'), true);
|
||||
$module = moduleCache::getModule($modules[$m], $scope);
|
||||
$icon = $module->getIcon();
|
||||
if (($icon != null) && !(strpos($icon, 'http') === 0) && !(strpos($icon, '/') === 0)) {
|
||||
if (!empty($icon) && !(strpos($icon, 'http') === 0) && !(strpos($icon, '/') === 0)) {
|
||||
$icon = '../../graphics/' . $icon;
|
||||
}
|
||||
$moduleTitle = new htmlSubTitle(getModuleAlias($modules[$m], $scope), $icon);
|
||||
|
@ -413,7 +413,7 @@ function showMainPage($type, $selectedModules) {
|
|||
$odd = true;
|
||||
for ($i = 0; $i < sizeof($columns[$modules[$m]]); $i++) {
|
||||
$required = false;
|
||||
if (isset($columns[$modules[$m]][$i]['required']) && ($columns[$modules[$m]][$i]['required'] == true)) {
|
||||
if (isset($columns[$modules[$m]][$i]['required']) && ($columns[$modules[$m]][$i]['required'] === true)) {
|
||||
$required = true;
|
||||
}
|
||||
$rowCells = array();
|
||||
|
|
Loading…
Reference in New Issue