Created
October 27, 2015 16:44
-
-
Save gwillem/dd421fef3a6370097a93 to your computer and use it in GitHub Desktop.
6788 for 1.9.2.1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git .htaccess .htaccess | |
index 60e1795..aca7f55 100644 | |
--- .htaccess | |
+++ .htaccess | |
@@ -207,3 +207,28 @@ | |
## http://developer.yahoo.com/performance/rules.html#etags | |
#FileETag none | |
+ | |
+########################################### | |
+## Deny access to cron.php | |
+ <Files cron.php> | |
+ | |
+############################################ | |
+## uncomment next lines to enable cron access with base HTTP authorization | |
+## http://httpd.apache.org/docs/2.2/howto/auth.html | |
+## | |
+## Warning: .htpasswd file should be placed somewhere not accessible from the web. | |
+## This is so that folks cannot download the password file. | |
+## For example, if your documents are served out of /usr/local/apache/htdocs | |
+## you might want to put the password file(s) in /usr/local/apache/. | |
+ | |
+ #AuthName "Cron auth" | |
+ #AuthUserFile ../.htpasswd | |
+ #AuthType basic | |
+ #Require valid-user | |
+ | |
+############################################ | |
+ | |
+ Order allow,deny | |
+ Deny from all | |
+ | |
+ </Files> | |
diff --git .htaccess.sample .htaccess.sample | |
index b8821af..383313a 100644 | |
--- .htaccess.sample | |
+++ .htaccess.sample | |
@@ -176,3 +176,27 @@ | |
#FileETag none | |
+########################################### | |
+## Deny access to cron.php | |
+ <Files cron.php> | |
+ | |
+############################################ | |
+## uncomment next lines to enable cron access with base HTTP authorization | |
+## http://httpd.apache.org/docs/2.2/howto/auth.html | |
+## | |
+## Warning: .htpasswd file should be placed somewhere not accessible from the web. | |
+## This is so that folks cannot download the password file. | |
+## For example, if your documents are served out of /usr/local/apache/htdocs | |
+## you might want to put the password file(s) in /usr/local/apache/. | |
+ | |
+ #AuthName "Cron auth" | |
+ #AuthUserFile ../.htpasswd | |
+ #AuthType basic | |
+ #Require valid-user | |
+ | |
+############################################ | |
+ | |
+ Order allow,deny | |
+ Deny from all | |
+ | |
+ </Files> | |
diff --git app/code/core/Mage/Admin/Model/Block.php app/code/core/Mage/Admin/Model/Block.php | |
new file mode 100644 | |
index 0000000..b33db1b | |
--- /dev/null | |
+++ app/code/core/Mage/Admin/Model/Block.php | |
@@ -0,0 +1,84 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Admin | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Mage_Admin_Model_Block | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Admin_Model_Block extends Mage_Core_Model_Abstract | |
+{ | |
+ /** | |
+ * Initialize variable model | |
+ */ | |
+ protected function _construct() | |
+ { | |
+ $this->_init('admin/block'); | |
+ } | |
+ | |
+ /** | |
+ * @return array|bool | |
+ * @throws Exception | |
+ * @throws Zend_Validate_Exception | |
+ */ | |
+ public function validate() | |
+ { | |
+ $errors = array(); | |
+ | |
+ if (!Zend_Validate::is($this->getBlockName(), 'NotEmpty')) { | |
+ $errors[] = Mage::helper('adminhtml')->__('Block Name is required field.'); | |
+ } | |
+ if (!Zend_Validate::is($this->getBlockName(), 'Regex', array('/^[-_a-zA-Z0-9\/]*$/'))) { | |
+ $errors[] = Mage::helper('adminhtml')->__('Block Name is incorrect.'); | |
+ } | |
+ | |
+ if (!in_array($this->getIsAllowed(), array('0', '1'))) { | |
+ $errors[] = Mage::helper('adminhtml')->__('Is Allowed is required field.'); | |
+ } | |
+ | |
+ if (empty($errors)) { | |
+ return true; | |
+ } | |
+ return $errors; | |
+ } | |
+ | |
+ /** | |
+ * Check is block with such type allowed for parsinf via blockDirective method | |
+ * | |
+ * @param $type | |
+ * @return int | |
+ */ | |
+ public function isTypeAllowed($type) | |
+ { | |
+ /** @var Mage_Admin_Model_Resource_Block_Collection $collection */ | |
+ $collection = Mage::getResourceModel('admin/block_collection'); | |
+ $collection->addFieldToFilter('block_name', array('eq' => $type)) | |
+ ->addFieldToFilter('is_allowed', array('eq' => 1)); | |
+ return $collection->load()->count(); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Admin/Model/Resource/Block.php app/code/core/Mage/Admin/Model/Resource/Block.php | |
new file mode 100644 | |
index 0000000..99b1c33 | |
--- /dev/null | |
+++ app/code/core/Mage/Admin/Model/Resource/Block.php | |
@@ -0,0 +1,44 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Admin | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Mage_Admin_Model_Resource_Block | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Admin_Model_Resource_Block extends Mage_Core_Model_Resource_Db_Abstract | |
+{ | |
+ /** | |
+ * Define main table | |
+ * | |
+ */ | |
+ protected function _construct() | |
+ { | |
+ $this->_init('admin/permission_block', 'block_id'); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Admin/Model/Resource/Block/Collection.php app/code/core/Mage/Admin/Model/Resource/Block/Collection.php | |
new file mode 100644 | |
index 0000000..4b64825 | |
--- /dev/null | |
+++ app/code/core/Mage/Admin/Model/Resource/Block/Collection.php | |
@@ -0,0 +1,44 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Admin | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Admin permissions block collection | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Admin_Model_Resource_Block_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract | |
+{ | |
+ /** | |
+ * Define resource model | |
+ * | |
+ */ | |
+ protected function _construct() | |
+ { | |
+ $this->_init('admin/block'); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Admin/Model/Resource/Variable.php app/code/core/Mage/Admin/Model/Resource/Variable.php | |
new file mode 100644 | |
index 0000000..b742097 | |
--- /dev/null | |
+++ app/code/core/Mage/Admin/Model/Resource/Variable.php | |
@@ -0,0 +1,43 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Admin | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Resource model for manipulate system variables | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Admin | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Admin_Model_Resource_Variable extends Mage_Core_Model_Resource_Db_Abstract | |
+{ | |
+ /** | |
+ * Define main table | |
+ */ | |
+ protected function _construct() | |
+ { | |
+ $this->_init('admin/permission_variable', 'variable_id'); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Admin/Model/Resource/Variable/Collection.php app/code/core/Mage/Admin/Model/Resource/Variable/Collection.php | |
new file mode 100644 | |
index 0000000..54ab1e5 | |
--- /dev/null | |
+++ app/code/core/Mage/Admin/Model/Resource/Variable/Collection.php | |
@@ -0,0 +1,44 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Admin | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Admin permissions variable collection | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Admin | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Admin_Model_Resource_Variable_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract | |
+{ | |
+ /** | |
+ * Define resource model | |
+ * | |
+ */ | |
+ protected function _construct() | |
+ { | |
+ $this->_init('admin/variable'); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Admin/Model/Variable.php app/code/core/Mage/Admin/Model/Variable.php | |
new file mode 100644 | |
index 0000000..e353a2c | |
--- /dev/null | |
+++ app/code/core/Mage/Admin/Model/Variable.php | |
@@ -0,0 +1,80 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Admin | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Mage_Admin_Model_Variable | |
+ */ | |
+class Mage_Admin_Model_Variable extends Mage_Core_Model_Abstract | |
+{ | |
+ /** | |
+ * Initialize variable model | |
+ */ | |
+ protected function _construct() | |
+ { | |
+ $this->_init('admin/variable'); | |
+ } | |
+ | |
+ /** | |
+ * @return array|bool | |
+ * @throws Exception | |
+ * @throws Zend_Validate_Exception | |
+ */ | |
+ public function validate() | |
+ { | |
+ $errors = array(); | |
+ | |
+ if (!Zend_Validate::is($this->getVariableName(), 'NotEmpty')) { | |
+ $errors[] = Mage::helper('adminhtml')->__('Variable Name is required field.'); | |
+ } | |
+ if (!Zend_Validate::is($this->getVariableName(), 'Regex', array('/^[-_a-zA-Z0-9\/]*$/'))) { | |
+ $errors[] = Mage::helper('adminhtml')->__('Variable Name is incorrect.'); | |
+ } | |
+ | |
+ if (!in_array($this->getIsAllowed(), array('0', '1'))) { | |
+ $errors[] = Mage::helper('adminhtml')->__('Is Allowed is required field.'); | |
+ } | |
+ | |
+ if (empty($errors)) { | |
+ return true; | |
+ } | |
+ return $errors; | |
+ } | |
+ | |
+ /** | |
+ * Check is config directive with given path can be parsed via configDirective method | |
+ * | |
+ * @param $path string | |
+ * @return int | |
+ */ | |
+ public function isPathAllowed($path) | |
+ { | |
+ /** @var Mage_Admin_Model_Resource_Variable_Collection $collection */ | |
+ $collection = Mage::getResourceModel('admin/variable_collection'); | |
+ $collection->addFieldToFilter('variable_name', array('eq' => $path)) | |
+ ->addFieldToFilter('is_allowed', array('eq' => 1)); | |
+ return $collection->load()->count(); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Admin/etc/config.xml app/code/core/Mage/Admin/etc/config.xml | |
index 7136e9c..774b17b 100644 | |
--- app/code/core/Mage/Admin/etc/config.xml | |
+++ app/code/core/Mage/Admin/etc/config.xml | |
@@ -28,7 +28,7 @@ | |
<config> | |
<modules> | |
<Mage_Admin> | |
- <version>1.6.1.1</version> | |
+ <version>1.6.1.2</version> | |
</Mage_Admin> | |
</modules> | |
<global> | |
@@ -50,6 +50,12 @@ | |
<rule> | |
<table>admin_rule</table> | |
</rule> | |
+ <permission_variable> | |
+ <table>permission_variable</table> | |
+ </permission_variable> | |
+ <permission_block> | |
+ <table>permission_block</table> | |
+ </permission_block> | |
<assert> | |
<table>admin_assert</table> | |
</assert> | |
diff --git app/code/core/Mage/Admin/sql/admin_setup/upgrade-1.6.1.1-1.6.1.2.php app/code/core/Mage/Admin/sql/admin_setup/upgrade-1.6.1.1-1.6.1.2.php | |
new file mode 100644 | |
index 0000000..1846958 | |
--- /dev/null | |
+++ app/code/core/Mage/Admin/sql/admin_setup/upgrade-1.6.1.1-1.6.1.2.php | |
@@ -0,0 +1,103 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Admin | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** @var $installer Mage_Core_Model_Resource_Setup */ | |
+$installer = $this; | |
+$installer->startSetup(); | |
+ | |
+$table = $installer->getConnection() | |
+ ->newTable($installer->getTable('admin/permission_variable')) | |
+ ->addColumn('variable_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( | |
+ 'identity' => true, | |
+ 'unsigned' => true, | |
+ 'nullable' => false, | |
+ 'primary' => true, | |
+ ), 'Variable ID') | |
+ ->addColumn('variable_name', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array( | |
+ 'primary' => true, | |
+ 'nullable' => false, | |
+ 'default' => "", | |
+ ), 'Config Path') | |
+ ->addColumn('is_allowed', Varien_Db_Ddl_Table::TYPE_BOOLEAN, null, array( | |
+ 'nullable' => false, | |
+ 'default' => 0, | |
+ ), 'Mark that config can be processed by filters') | |
+ ->addIndex($installer->getIdxName('admin/permission_variable', array('variable_name'), Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE), | |
+ array('variable_name'), array('type' => Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE)) | |
+ ->setComment('System variables that can be processed via content filter'); | |
+$installer->getConnection()->createTable($table); | |
+ | |
+$installer->getConnection()->insertMultiple( | |
+ $installer->getTable('admin/permission_variable'), | |
+ array( | |
+ array('variable_name' => 'trans_email/ident_support/name', 'is_allowed' => 1), | |
+ array('variable_name' => 'trans_email/ident_support/email','is_allowed' => 1), | |
+ array('variable_name' => 'web/unsecure/base_url','is_allowed' => 1), | |
+ array('variable_name' => 'web/secure/base_url','is_allowed' => 1), | |
+ array('variable_name' => 'trans_email/ident_general/name','is_allowed' => 1), | |
+ array('variable_name' => 'trans_email/ident_general/email', 'is_allowed' => 1), | |
+ array('variable_name' => 'trans_email/ident_sales/name','is_allowed' => 1), | |
+ array('variable_name' => 'trans_email/ident_sales/email','is_allowed' => 1), | |
+ array('variable_name' => 'trans_email/ident_custom1/name','is_allowed' => 1), | |
+ array('variable_name' => 'trans_email/ident_custom1/email','is_allowed' => 1), | |
+ array('variable_name' => 'trans_email/ident_custom2/name','is_allowed' => 1), | |
+ array('variable_name' => 'trans_email/ident_custom2/email','is_allowed' => 1), | |
+ array('variable_name' => 'general/store_information/name', 'is_allowed' => 1), | |
+ array('variable_name' => 'general/store_information/phone','is_allowed' => 1), | |
+ array('variable_name' => 'general/store_information/address', 'is_allowed' => 1), | |
+ ) | |
+); | |
+ | |
+$table = $installer->getConnection() | |
+ ->newTable($installer->getTable('admin/permission_block')) | |
+ ->addColumn('block_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( | |
+ 'identity' => true, | |
+ 'unsigned' => true, | |
+ 'nullable' => false, | |
+ 'primary' => true, | |
+ ), 'Block ID') | |
+ ->addColumn('block_name', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array( | |
+ 'nullable' => false, | |
+ 'default' => "", | |
+ ), 'Block Name') | |
+ ->addColumn('is_allowed', Varien_Db_Ddl_Table::TYPE_BOOLEAN, null, array( | |
+ 'nullable' => false, | |
+ 'default' => 0, | |
+ ), 'Mark that block can be processed by filters') | |
+ ->addIndex($installer->getIdxName('admin/permission_block', array('block_name'), Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE), | |
+ array('block_name'), array('type' => Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE)) | |
+ ->setComment('System blocks that can be processed via content filter'); | |
+$installer->getConnection()->createTable($table); | |
+ | |
+$installer->getConnection()->insertMultiple( | |
+ $installer->getTable('admin/permission_block'), | |
+ array( | |
+ array('block_name' => 'core/template', 'is_allowed' => 1), | |
+ array('block_name' => 'catalog/product_new', 'is_allowed' => 1), | |
+ ) | |
+); | |
+ | |
+$installer->endSetup(); | |
diff --git app/code/core/Mage/Adminhtml/Block/Permissions/Block.php app/code/core/Mage/Adminhtml/Block/Permissions/Block.php | |
new file mode 100644 | |
index 0000000..c096cde | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/Block/Permissions/Block.php | |
@@ -0,0 +1,57 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Adminhtml permissions block | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Block_Permissions_Block extends Mage_Adminhtml_Block_Widget_Grid_Container | |
+{ | |
+ /** | |
+ * Construct | |
+ */ | |
+ public function __construct() | |
+ { | |
+ $this->_controller = 'permissions_block'; | |
+ $this->_headerText = Mage::helper('adminhtml')->__('Blocks'); | |
+ $this->_addButtonLabel = Mage::helper('adminhtml')->__('Add New Block'); | |
+ parent::__construct(); | |
+ } | |
+ | |
+ /** | |
+ * Prepare output HTML | |
+ * | |
+ * @return string | |
+ */ | |
+ protected function _toHtml() | |
+ { | |
+ Mage::dispatchEvent('permissions_block_html_before', array('block' => $this)); | |
+ return parent::_toHtml(); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/Block/Permissions/Block/Edit.php app/code/core/Mage/Adminhtml/Block/Permissions/Block/Edit.php | |
new file mode 100644 | |
index 0000000..75cc9ef | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/Block/Permissions/Block/Edit.php | |
@@ -0,0 +1,64 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Adminhtml permissions block edit page | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Block_Permissions_Block_Edit extends Mage_Adminhtml_Block_Widget_Form_Container | |
+{ | |
+ /** | |
+ * Construct | |
+ */ | |
+ public function __construct() | |
+ { | |
+ $this->_objectId = 'block_id'; | |
+ $this->_controller = 'permissions_block'; | |
+ | |
+ parent::__construct(); | |
+ | |
+ $this->_updateButton('save', 'label', Mage::helper('adminhtml')->__('Save Block')); | |
+ $this->_updateButton('delete', 'label', Mage::helper('adminhtml')->__('Delete Block')); | |
+ } | |
+ | |
+ /** | |
+ * Return text that to be placed to block header | |
+ * | |
+ * @return string | |
+ */ | |
+ public function getHeaderText() | |
+ { | |
+ if (Mage::registry('permissions_block')->getId()) { | |
+ return Mage::helper('adminhtml')->__("Edit Block '%s'", $this->escapeHtml(Mage::registry('permissions_block')->getBlockName())); | |
+ } | |
+ else { | |
+ return Mage::helper('adminhtml')->__('New block'); | |
+ } | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/Block/Permissions/Block/Edit/Form.php app/code/core/Mage/Adminhtml/Block/Permissions/Block/Edit/Form.php | |
new file mode 100644 | |
index 0000000..8d29480 | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/Block/Permissions/Block/Edit/Form.php | |
@@ -0,0 +1,84 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Adminhtml permissions user edit form | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Block_Permissions_Block_Edit_Form extends Mage_Adminhtml_Block_Widget_Form | |
+{ | |
+ | |
+ /** | |
+ * @return Mage_Adminhtml_Block_Widget_Form | |
+ * @throws Exception | |
+ */ | |
+ protected function _prepareForm() | |
+ { | |
+ $block = Mage::getModel('admin/block')->load((int) $this->getRequest()->getParam('block_id')); | |
+ | |
+ $form = new Varien_Data_Form(array( | |
+ 'id' => 'edit_form', | |
+ 'action' => $this->getUrl('*/*/save', array('block_id' => (int) $this->getRequest()->getParam('block_id'))), | |
+ 'method' => 'post' | |
+ )); | |
+ $fieldset = $form->addFieldset( | |
+ 'block_details', array('legend' => $this->__('Block Details')) | |
+ ); | |
+ | |
+ $fieldset->addField('block_name', 'text', array( | |
+ 'label' => $this->__('Block Name'), | |
+ 'required' => true, | |
+ 'name' => 'block_name', | |
+ )); | |
+ | |
+ | |
+ $yesno = array( | |
+ array( | |
+ 'value' => 0, | |
+ 'label' => $this->__('No') | |
+ ), | |
+ array( | |
+ 'value' => 1, | |
+ 'label' => $this->__('Yes') | |
+ )); | |
+ | |
+ | |
+ $fieldset->addField('is_allowed', 'select', array( | |
+ 'name' => 'is_allowed', | |
+ 'label' => $this->__('Is Allowed'), | |
+ 'title' => $this->__('Is Allowed'), | |
+ 'values' => $yesno, | |
+ )); | |
+ | |
+ $form->setUseContainer(true); | |
+ $form->setValues($block->getData()); | |
+ $this->setForm($form); | |
+ return parent::_prepareForm(); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/Block/Permissions/Block/Grid.php app/code/core/Mage/Adminhtml/Block/Permissions/Block/Grid.php | |
new file mode 100644 | |
index 0000000..426fd38 | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/Block/Permissions/Block/Grid.php | |
@@ -0,0 +1,103 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Adminhtml permissions block grid | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Block_Permissions_Block_Grid extends Mage_Adminhtml_Block_Widget_Grid | |
+{ | |
+ /** | |
+ * Construct | |
+ */ | |
+ public function __construct() | |
+ { | |
+ parent::__construct(); | |
+ $this->setId('permissionsBlockGrid'); | |
+ $this->setDefaultSort('block_id'); | |
+ $this->setDefaultDir('asc'); | |
+ $this->setUseAjax(true); | |
+ } | |
+ | |
+ /** | |
+ * @return Mage_Adminhtml_Block_Widget_Grid | |
+ */ | |
+ protected function _prepareCollection() | |
+ { | |
+ $collection = Mage::getResourceModel('admin/block_collection'); | |
+ $this->setCollection($collection); | |
+ return parent::_prepareCollection(); | |
+ } | |
+ | |
+ /** | |
+ * @return $this | |
+ * @throws Exception | |
+ */ | |
+ protected function _prepareColumns() | |
+ { | |
+ $this->addColumn('block_id', array( | |
+ 'header' => Mage::helper('adminhtml')->__('ID'), | |
+ 'width' => 5, | |
+ 'align' => 'right', | |
+ 'sortable' => true, | |
+ 'index' => 'block_id' | |
+ )); | |
+ | |
+ $this->addColumn('block_name', array( | |
+ 'header' => Mage::helper('adminhtml')->__('Block Name'), | |
+ 'index' => 'block_name' | |
+ )); | |
+ | |
+ $this->addColumn('is_allowed', array( | |
+ 'header' => Mage::helper('adminhtml')->__('Status'), | |
+ 'index' => 'is_allowed', | |
+ 'type' => 'options', | |
+ 'options' => array('1' => Mage::helper('adminhtml')->__('Allowed'), '0' => Mage::helper('adminhtml')->__('Not allowed')), | |
+ )); | |
+ | |
+ return parent::_prepareColumns(); | |
+ } | |
+ | |
+ /** | |
+ * @param $row | |
+ * @return string | |
+ */ | |
+ public function getRowUrl($row) | |
+ { | |
+ return $this->getUrl('*/*/edit', array('block_id' => $row->getId())); | |
+ } | |
+ | |
+ /** | |
+ * @return string | |
+ */ | |
+ public function getGridUrl() | |
+ { | |
+ return $this->getUrl('*/*/blockGrid', array()); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/Block/Permissions/Variable.php app/code/core/Mage/Adminhtml/Block/Permissions/Variable.php | |
new file mode 100644 | |
index 0000000..37cd6e6 | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/Block/Permissions/Variable.php | |
@@ -0,0 +1,57 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Variables block | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Block_Permissions_Variable extends Mage_Adminhtml_Block_Widget_Grid_Container | |
+{ | |
+ /** | |
+ * Construct | |
+ */ | |
+ public function __construct() | |
+ { | |
+ $this->_controller = 'permissions_variable'; | |
+ $this->_headerText = Mage::helper('adminhtml')->__('Variables'); | |
+ $this->_addButtonLabel = Mage::helper('adminhtml')->__('Add new variable'); | |
+ parent::__construct(); | |
+ } | |
+ | |
+ /** | |
+ * Prepare output HTML | |
+ * | |
+ * @return string | |
+ */ | |
+ protected function _toHtml() | |
+ { | |
+ Mage::dispatchEvent('permissions_variable_html_before', array('block' => $this)); | |
+ return parent::_toHtml(); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/Block/Permissions/Variable/Edit.php app/code/core/Mage/Adminhtml/Block/Permissions/Variable/Edit.php | |
new file mode 100644 | |
index 0000000..0642944 | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/Block/Permissions/Variable/Edit.php | |
@@ -0,0 +1,62 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Adminhtml permissions variable edit page | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Block_Permissions_Variable_Edit extends Mage_Adminhtml_Block_Widget_Form_Container | |
+{ | |
+ /** | |
+ * Construct | |
+ */ | |
+ public function __construct() | |
+ { | |
+ $this->_objectId = 'variable_id'; | |
+ $this->_controller = 'permissions_variable'; | |
+ | |
+ parent::__construct(); | |
+ | |
+ $this->_updateButton('save', 'label', Mage::helper('adminhtml')->__('Save Variable')); | |
+ $this->_updateButton('delete', 'label', Mage::helper('adminhtml')->__('Delete Variable')); | |
+ } | |
+ | |
+ /** | |
+ * @return string | |
+ */ | |
+ public function getHeaderText() | |
+ { | |
+ if (Mage::registry('permissions_variable')->getId()) { | |
+ return Mage::helper('adminhtml')->__("Edit Variable '%s'", $this->escapeHtml(Mage::registry('permissions_variable')->getVariableName())); | |
+ } | |
+ else { | |
+ return Mage::helper('adminhtml')->__('New Variable'); | |
+ } | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/Block/Permissions/Variable/Edit/Form.php app/code/core/Mage/Adminhtml/Block/Permissions/Variable/Edit/Form.php | |
new file mode 100644 | |
index 0000000..0b71406 | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/Block/Permissions/Variable/Edit/Form.php | |
@@ -0,0 +1,88 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Adminhtml permissions variable edit form | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Block_Permissions_Variable_Edit_Form extends Mage_Adminhtml_Block_Widget_Form | |
+{ | |
+ /** | |
+ * @return Mage_Adminhtml_Block_Widget_Form | |
+ * @throws Exception | |
+ */ | |
+ protected function _prepareForm() | |
+ { | |
+ $block = Mage::getModel('admin/variable')->load((int) $this->getRequest()->getParam('variable_id')); | |
+ | |
+ $form = new Varien_Data_Form(array( | |
+ 'id' => 'edit_form', | |
+ 'action' => $this->getUrl( | |
+ '*/*/save', | |
+ array( | |
+ 'variable_id' => (int) $this->getRequest()->getParam('variable_id') | |
+ ) | |
+ ), | |
+ 'method' => 'post' | |
+ )); | |
+ $fieldset = $form->addFieldset( | |
+ 'variable_details', array('legend' => $this->__('Variable Details')) | |
+ ); | |
+ | |
+ $fieldset->addField('variable_name', 'text', array( | |
+ 'label' => $this->__('Variable Name'), | |
+ 'required' => true, | |
+ 'name' => 'variable_name', | |
+ )); | |
+ | |
+ | |
+ $yesno = array( | |
+ array( | |
+ 'value' => 0, | |
+ 'label' => $this->__('No') | |
+ ), | |
+ array( | |
+ 'value' => 1, | |
+ 'label' => $this->__('Yes') | |
+ )); | |
+ | |
+ | |
+ $fieldset->addField('is_allowed', 'select', array( | |
+ 'name' => 'is_allowed', | |
+ 'label' => $this->__('Is Allowed'), | |
+ 'title' => $this->__('Is Allowed'), | |
+ 'values' => $yesno, | |
+ )); | |
+ | |
+ $form->setUseContainer(true); | |
+ $form->setValues($block->getData()); | |
+ $this->setForm($form); | |
+ return parent::_prepareForm(); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/Block/Permissions/Variable/Grid.php app/code/core/Mage/Adminhtml/Block/Permissions/Variable/Grid.php | |
new file mode 100644 | |
index 0000000..df186e8 | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/Block/Permissions/Variable/Grid.php | |
@@ -0,0 +1,104 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Adminhtml permissions variable grid | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Block_Permissions_Variable_Grid extends Mage_Adminhtml_Block_Widget_Grid | |
+{ | |
+ /** | |
+ * Construct | |
+ */ | |
+ public function __construct() | |
+ { | |
+ parent::__construct(); | |
+ $this->setId('permissionsVariableGrid'); | |
+ $this->setDefaultSort('variable_id'); | |
+ $this->setDefaultDir('asc'); | |
+ $this->setUseAjax(true); | |
+ } | |
+ | |
+ /** | |
+ * @return Mage_Adminhtml_Block_Widget_Grid | |
+ */ | |
+ protected function _prepareCollection() | |
+ { | |
+ /** @var Mage_Admin_Model_Resource_Variable_Collection $collection */ | |
+ $collection = Mage::getResourceModel('admin/variable_collection'); | |
+ $this->setCollection($collection); | |
+ return parent::_prepareCollection(); | |
+ } | |
+ | |
+ /** | |
+ * @throws Exception | |
+ */ | |
+ protected function _prepareColumns() | |
+ { | |
+ $this->addColumn('variable_id', array( | |
+ 'header' => Mage::helper('adminhtml')->__('ID'), | |
+ 'width' => 5, | |
+ 'align' => 'right', | |
+ 'sortable' => true, | |
+ 'index' => 'variable_id' | |
+ )); | |
+ $this->addColumn('variable_name', array( | |
+ 'header' => Mage::helper('adminhtml')->__('Variable'), | |
+ 'index' => 'variable_name' | |
+ )); | |
+ $this->addColumn('is_allowed', array( | |
+ 'header' => Mage::helper('adminhtml')->__('Status'), | |
+ 'index' => 'is_allowed', | |
+ 'type' => 'options', | |
+ 'options' => array( | |
+ '1' => Mage::helper('adminhtml')->__('Allowed'), | |
+ '0' => Mage::helper('adminhtml')->__('Not allowed')), | |
+ ) | |
+ ); | |
+ | |
+ parent::_prepareColumns(); | |
+ } | |
+ | |
+ /** | |
+ * @param $row | |
+ * @return string | |
+ */ | |
+ public function getRowUrl($row) | |
+ { | |
+ return $this->getUrl('*/*/edit', array('variable_id' => $row->getId())); | |
+ } | |
+ | |
+ /** | |
+ * @return string | |
+ */ | |
+ public function getGridUrl() | |
+ { | |
+ return $this->getUrl('*/*/variableGrid', array()); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/controllers/Permissions/BlockController.php app/code/core/Mage/Adminhtml/controllers/Permissions/BlockController.php | |
new file mode 100644 | |
index 0000000..eb91f85 | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/controllers/Permissions/BlockController.php | |
@@ -0,0 +1,216 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Mage_Adminhtml_Permissions_BlockController | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Permissions_BlockController extends Mage_Adminhtml_Controller_Action | |
+{ | |
+ /** | |
+ * @return $this | |
+ */ | |
+ protected function _initAction() | |
+ { | |
+ $this->loadLayout() | |
+ ->_setActiveMenu('system/acl') | |
+ ->_addBreadcrumb($this->__('System'), $this->__('System')) | |
+ ->_addBreadcrumb($this->__('Permissions'), $this->__('Permissions')) | |
+ ->_addBreadcrumb($this->__('Blocks'), $this->__('Blocks')); | |
+ return $this; | |
+ } | |
+ | |
+ /** | |
+ * Index action | |
+ */ | |
+ public function indexAction() | |
+ { | |
+ $this->_title($this->__('System')) | |
+ ->_title($this->__('Permissions')) | |
+ ->_title($this->__('Blocks')); | |
+ | |
+ /** @var Mage_Adminhtml_Block_Permissions_Block $block */ | |
+ $block = $this->getLayout()->createBlock('adminhtml/permissions_block'); | |
+ $this->_initAction() | |
+ ->_addContent($block) | |
+ ->renderLayout(); | |
+ } | |
+ | |
+ /** | |
+ * New action | |
+ */ | |
+ public function newAction() | |
+ { | |
+ $this->_forward('edit'); | |
+ } | |
+ | |
+ /** | |
+ * Edit action | |
+ */ | |
+ public function editAction() | |
+ { | |
+ $this->_title($this->__('System')) | |
+ ->_title($this->__('Permissions')) | |
+ ->_title($this->__('Blocks')); | |
+ | |
+ $id = (int) $this->getRequest()->getParam('block_id'); | |
+ $model = Mage::getModel('admin/block'); | |
+ | |
+ if ($id) { | |
+ $model->load($id); | |
+ if (! $model->getId()) { | |
+ Mage::getSingleton('adminhtml/session')->addError($this->__('This block no longer exists.')); | |
+ $this->_redirect('*/*/'); | |
+ return; | |
+ } | |
+ } | |
+ | |
+ $this->_title($model->getId() ? $model->getBlockName() : $this->__('New Block')); | |
+ | |
+ // Restore previously entered form data from session | |
+ $data = Mage::getSingleton('adminhtml/session')->getUserData(true); | |
+ if (!empty($data)) { | |
+ $model->setData($data); | |
+ } | |
+ | |
+ Mage::register('permissions_block', $model); | |
+ | |
+ if (isset($id)) { | |
+ $breadcrumb = $this->__('Edit Block'); | |
+ } else { | |
+ $breadcrumb = $this->__('New Block'); | |
+ } | |
+ $this->_initAction() | |
+ ->_addBreadcrumb($breadcrumb, $breadcrumb); | |
+ | |
+ $this->getLayout()->getBlock('adminhtml.permissions.block.edit') | |
+ ->setData('action', $this->getUrl('*/permissions_block/save')); | |
+ | |
+ $this->renderLayout(); | |
+ } | |
+ | |
+ /** | |
+ * Save action | |
+ * | |
+ * @return $this|void | |
+ */ | |
+ public function saveAction() | |
+ { | |
+ if ($data = $this->getRequest()->getPost()) { | |
+ $id = (int) $this->getRequest()->getParam('block_id'); | |
+ $model = Mage::getModel('admin/block')->load($id); | |
+ if (!$model->getId() && $id) { | |
+ Mage::getSingleton('adminhtml/session')->addError($this->__('This block no longer exists.')); | |
+ $this->_redirect('*/*/'); | |
+ return; | |
+ } | |
+ | |
+ $model->setData($data); | |
+ if ($id) { | |
+ $model->setId($id); | |
+ } | |
+ $result = $model->validate(); | |
+ | |
+ if (is_array($result)) { | |
+ Mage::getSingleton('adminhtml/session')->setUserData($data); | |
+ foreach ($result as $message) { | |
+ Mage::getSingleton('adminhtml/session')->addError($message); | |
+ } | |
+ $this->_redirect('*/*/edit', array('block_id' => $id)); | |
+ return $this; | |
+ } | |
+ try { | |
+ $model->save(); | |
+ Mage::getSingleton('adminhtml/session')->addSuccess($this->__('The block has been saved.')); | |
+ // clear previously saved data from session | |
+ Mage::getSingleton('adminhtml/session')->setFormData(false); | |
+ | |
+ $this->_redirect('*/*/'); | |
+ return; | |
+ | |
+ } catch (Exception $e) { | |
+ // display error message | |
+ Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); | |
+ // save data in session | |
+ Mage::getSingleton('adminhtml/session')->setFormData($data); | |
+ // redirect to edit form | |
+ $this->_redirect('*/*/edit', array('block_id' => $id)); | |
+ return; | |
+ } | |
+ } | |
+ $this->_redirect('*/*/'); | |
+ } | |
+ | |
+ /** | |
+ * Delete action | |
+ */ | |
+ public function deleteAction() | |
+ { | |
+ $id = (int) $this->getRequest()->getParam('block_id'); | |
+ if ($id) { | |
+ try { | |
+ $model = Mage::getModel('admin/block'); | |
+ $model->setId($id); | |
+ $model->delete(); | |
+ Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Block has been deleted.')); | |
+ $this->_redirect('*/*/'); | |
+ return; | |
+ } | |
+ catch (Exception $e) { | |
+ Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); | |
+ $this->_redirect('*/*/edit', array('block_id' => $id)); | |
+ return; | |
+ } | |
+ } | |
+ Mage::getSingleton('adminhtml/session')->addError($this->__('Unable to find a block to delete.')); | |
+ $this->_redirect('*/*/'); | |
+ } | |
+ | |
+ /** | |
+ * Grid action | |
+ */ | |
+ public function blockGridAction() | |
+ { | |
+ $this->getResponse() | |
+ ->setBody($this->getLayout() | |
+ ->createBlock('adminhtml/permissions_block_grid') | |
+ ->toHtml() | |
+ ); | |
+ } | |
+ | |
+ /** | |
+ * Check permissions before allow edit list of blocks | |
+ * | |
+ * @return bool | |
+ */ | |
+ protected function _isAllowed() | |
+ { | |
+ return Mage::getSingleton('admin/session')->isAllowed('system/acl/blocks'); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/controllers/Permissions/VariableController.php app/code/core/Mage/Adminhtml/controllers/Permissions/VariableController.php | |
new file mode 100644 | |
index 0000000..d8f34ac | |
--- /dev/null | |
+++ app/code/core/Mage/Adminhtml/controllers/Permissions/VariableController.php | |
@@ -0,0 +1,215 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Mage_Adminhtml_Permissions_VariableController | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Adminhtml | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Adminhtml_Permissions_VariableController extends Mage_Adminhtml_Controller_Action | |
+{ | |
+ /** | |
+ * @return $this | |
+ */ | |
+ protected function _initAction() | |
+ { | |
+ $this->loadLayout() | |
+ ->_setActiveMenu('system/acl') | |
+ ->_addBreadcrumb($this->__('System'), $this->__('System')) | |
+ ->_addBreadcrumb($this->__('Permissions'), $this->__('Permissions')) | |
+ ->_addBreadcrumb($this->__('Variables'), $this->__('Variables')); | |
+ return $this; | |
+ } | |
+ | |
+ /** | |
+ * Index action | |
+ */ | |
+ public function indexAction() | |
+ { | |
+ $this->_title($this->__('System')) | |
+ ->_title($this->__('Permissions')) | |
+ ->_title($this->__('Variables')); | |
+ | |
+ /** @var Mage_Adminhtml_Block_Permissions_Variables $block */ | |
+ $block = $this->getLayout()->createBlock('adminhtml/permissions_variable'); | |
+ $this->_initAction() | |
+ ->_addContent($block) | |
+ ->renderLayout(); | |
+ } | |
+ | |
+ /** | |
+ * New action | |
+ */ | |
+ public function newAction() | |
+ { | |
+ $this->_forward('edit'); | |
+ } | |
+ | |
+ /** | |
+ * Edit action | |
+ */ | |
+ public function editAction() | |
+ { | |
+ $this->_title($this->__('System')) | |
+ ->_title($this->__('Permissions')) | |
+ ->_title($this->__('Variables')); | |
+ | |
+ $id = (int) $this->getRequest()->getParam('variable_id'); | |
+ $model = Mage::getModel('admin/variable'); | |
+ | |
+ if ($id) { | |
+ $model->load($id); | |
+ if (!$model->getId()) { | |
+ Mage::getSingleton('adminhtml/session')->addError($this->__('This variable no longer exists.')); | |
+ $this->_redirect('*/*/'); | |
+ return; | |
+ } | |
+ } | |
+ | |
+ $this->_title($model->getId() ? $model->getVariableName() : $this->__('New Variable')); | |
+ | |
+ // Restore previously entered form data from session | |
+ $data = Mage::getSingleton('adminhtml/session')->getUserData(true); | |
+ if (!empty($data)) { | |
+ $model->setData($data); | |
+ } | |
+ | |
+ Mage::register('permissions_variable', $model); | |
+ | |
+ if (isset($id)) { | |
+ $breadcrumb = $this->__('Edit Variable'); | |
+ } else { | |
+ $breadcrumb = $this->__('New Variable'); | |
+ } | |
+ $this->_initAction() | |
+ ->_addBreadcrumb($breadcrumb, $breadcrumb); | |
+ | |
+ $this->getLayout()->getBlock('adminhtml.permissions.variable.edit') | |
+ ->setData('action', $this->getUrl('*/permissions_variable/save')); | |
+ | |
+ $this->renderLayout(); | |
+ } | |
+ | |
+ /** | |
+ * Save action | |
+ * | |
+ * @return $this|void | |
+ */ | |
+ public function saveAction() | |
+ { | |
+ if ($data = $this->getRequest()->getPost()) { | |
+ $id = (int) $this->getRequest()->getParam('variable_id'); | |
+ $model = Mage::getModel('admin/variable')->load($id); | |
+ if (!$model->getId() && $id) { | |
+ Mage::getSingleton('adminhtml/session')->addError($this->__('This variable no longer exists.')); | |
+ $this->_redirect('*/*/'); | |
+ return; | |
+ } | |
+ | |
+ $model->setData($data); | |
+ if ($id) { | |
+ $model->setId($id); | |
+ } | |
+ $result = $model->validate(); | |
+ | |
+ if (is_array($result)) { | |
+ Mage::getSingleton('adminhtml/session')->setUserData($data); | |
+ foreach ($result as $message) { | |
+ Mage::getSingleton('adminhtml/session')->addError($message); | |
+ } | |
+ $this->_redirect('*/*/edit', array('variable_id' => $id)); | |
+ return $this; | |
+ } | |
+ try { | |
+ $model->save(); | |
+ Mage::getSingleton('adminhtml/session')->addSuccess($this->__('The variable has been saved.')); | |
+ // clear previously saved data from session | |
+ Mage::getSingleton('adminhtml/session')->setFormData(false); | |
+ | |
+ $this->_redirect('*/*/'); | |
+ return; | |
+ | |
+ } catch (Exception $e) { | |
+ // display error message | |
+ Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); | |
+ // save data in session | |
+ Mage::getSingleton('adminhtml/session')->setFormData($data); | |
+ // redirect to edit form | |
+ $this->_redirect('*/*/edit', array('variable_id' => $id)); | |
+ return; | |
+ } | |
+ } | |
+ $this->_redirect('*/*/'); | |
+ } | |
+ | |
+ /** | |
+ * Delete action | |
+ */ | |
+ public function deleteAction() | |
+ { | |
+ $id = (int) $this->getRequest()->getParam('variable_id'); | |
+ if ($id) { | |
+ try { | |
+ $model = Mage::getModel('admin/variable'); | |
+ $model->setId($id); | |
+ $model->delete(); | |
+ Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Variable has been deleted.')); | |
+ $this->_redirect('*/*/'); | |
+ return; | |
+ } catch (Exception $e) { | |
+ Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); | |
+ $this->_redirect('*/*/edit', array('variable_id' => $id)); | |
+ return; | |
+ } | |
+ } | |
+ Mage::getSingleton('adminhtml/session')->addError($this->__('Unable to find a variable to delete.')); | |
+ $this->_redirect('*/*/'); | |
+ } | |
+ | |
+ /** | |
+ * Grid action | |
+ */ | |
+ public function variableGridAction() | |
+ { | |
+ $this->getResponse() | |
+ ->setBody($this->getLayout() | |
+ ->createBlock('adminhtml/permissions_variable_grid') | |
+ ->toHtml() | |
+ ); | |
+ } | |
+ | |
+ /** | |
+ * Check permissions before allow edit list of config variables | |
+ * | |
+ * @return bool | |
+ */ | |
+ protected function _isAllowed() | |
+ { | |
+ return Mage::getSingleton('admin/session')->isAllowed('system/acl/variables'); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Adminhtml/etc/adminhtml.xml app/code/core/Mage/Adminhtml/etc/adminhtml.xml | |
index 9c44731..82ddb0b 100644 | |
--- app/code/core/Mage/Adminhtml/etc/adminhtml.xml | |
+++ app/code/core/Mage/Adminhtml/etc/adminhtml.xml | |
@@ -94,6 +94,14 @@ | |
<title>Roles</title> | |
<action>adminhtml/permissions_role</action> | |
</roles> | |
+ <variables translate="title"> | |
+ <title>Variables</title> | |
+ <action>adminhtml/permissions_variable</action> | |
+ </variables> | |
+ <blocks translate="title"> | |
+ <title>Blocks</title> | |
+ <action>adminhtml/permissions_block</action> | |
+ </blocks> | |
</children> | |
</acl> | |
<cache translate="title"> | |
@@ -142,6 +150,12 @@ | |
<title>Users</title> | |
<sort_order>20</sort_order> | |
</users> | |
+ <variables translate="title"> | |
+ <title>Variables</title> | |
+ </variables> | |
+ <blocks translate="title"> | |
+ <title>Blocks</title> | |
+ </blocks> | |
</children> | |
</acl> | |
<store translate="title"> | |
diff --git app/code/core/Mage/Catalog/Model/Product/Option/Type/File.php app/code/core/Mage/Catalog/Model/Product/Option/Type/File.php | |
index 65c4ec9..db7fb2b 100644 | |
--- app/code/core/Mage/Catalog/Model/Product/Option/Type/File.php | |
+++ app/code/core/Mage/Catalog/Model/Product/Option/Type/File.php | |
@@ -126,17 +126,9 @@ class Mage_Catalog_Model_Product_Option_Type_File extends Mage_Catalog_Model_Pro | |
* Check whether we receive uploaded file or restore file by: reorder/edit configuration or | |
* previous configuration with no newly uploaded file | |
*/ | |
- $fileInfo = null; | |
- if (isset($values[$option->getId()]) && is_array($values[$option->getId()])) { | |
- // Legacy style, file info comes in array with option id index | |
- $fileInfo = $values[$option->getId()]; | |
- } else { | |
- /* | |
- * New recommended style - file info comes in request processing parameters and we | |
- * sure that this file info originates from Magento, not from manually formed POST request | |
- */ | |
- $fileInfo = $this->_getCurrentConfigFileInfo(); | |
- } | |
+ | |
+ $fileInfo = $this->_getCurrentConfigFileInfo(); | |
+ | |
if ($fileInfo !== null) { | |
if (is_array($fileInfo) && $this->_validateFile($fileInfo)) { | |
$value = $fileInfo; | |
@@ -448,6 +440,11 @@ class Mage_Catalog_Model_Product_Option_Type_File extends Mage_Catalog_Model_Pro | |
// Save option in request, because we have no $_FILES['options'] | |
$requestOptions[$this->getOption()->getId()] = $value; | |
$result = serialize($value); | |
+ try { | |
+ Mage::helper('core/unserializeArray')->unserialize($result); | |
+ } catch (Exception $e) { | |
+ Mage::throwException(Mage::helper('catalog')->__("File options format is not valid.")); | |
+ } | |
} else { | |
/* | |
* Clear option info from request, so it won't be stored in our db upon | |
@@ -478,7 +475,7 @@ class Mage_Catalog_Model_Product_Option_Type_File extends Mage_Catalog_Model_Pro | |
{ | |
if ($this->_formattedOptionValue === null) { | |
try { | |
- $value = unserialize($optionValue); | |
+ $value = Mage::helper('core/unserializeArray')->unserialize($optionValue); | |
$customOptionUrlParams = $this->getCustomOptionUrlParams() | |
? $this->getCustomOptionUrlParams() | |
@@ -542,7 +539,7 @@ class Mage_Catalog_Model_Product_Option_Type_File extends Mage_Catalog_Model_Pro | |
if (is_array($value)) { | |
return $value; | |
} elseif (is_string($value) && !empty($value)) { | |
- return unserialize($value); | |
+ return Mage::helper('core/unserializeArray')->unserialize($value); | |
} else { | |
return array(); | |
} | |
@@ -568,7 +565,7 @@ class Mage_Catalog_Model_Product_Option_Type_File extends Mage_Catalog_Model_Pro | |
public function getEditableOptionValue($optionValue) | |
{ | |
try { | |
- $value = unserialize($optionValue); | |
+ $value = Mage::helper('core/unserializeArray')->unserialize($optionValue); | |
return sprintf('%s [%d]', | |
Mage::helper('core')->escapeHtml($value['title']), | |
$this->getConfigurationItemOption()->getId() | |
@@ -593,7 +590,6 @@ class Mage_Catalog_Model_Product_Option_Type_File extends Mage_Catalog_Model_Pro | |
$confItemOptionId = $matches[1]; | |
$option = Mage::getModel('sales/quote_item_option')->load($confItemOptionId); | |
try { | |
- unserialize($option->getValue()); | |
return $option->getValue(); | |
} catch (Exception $e) { | |
return null; | |
@@ -612,7 +608,7 @@ class Mage_Catalog_Model_Product_Option_Type_File extends Mage_Catalog_Model_Pro | |
public function prepareOptionValueForRequest($optionValue) | |
{ | |
try { | |
- $result = unserialize($optionValue); | |
+ $result = Mage::helper('core/unserializeArray')->unserialize($optionValue); | |
return $result; | |
} catch (Exception $e) { | |
return null; | |
@@ -628,7 +624,7 @@ class Mage_Catalog_Model_Product_Option_Type_File extends Mage_Catalog_Model_Pro | |
{ | |
$quoteOption = $this->getQuoteItemOption(); | |
try { | |
- $value = unserialize($quoteOption->getValue()); | |
+ $value = Mage::helper('core/unserializeArray')->unserialize($quoteOption->getValue()); | |
if (!isset($value['quote_path'])) { | |
throw new Exception(); | |
} | |
diff --git app/code/core/Mage/Core/Controller/Front/Action.php app/code/core/Mage/Core/Controller/Front/Action.php | |
index 6dab88b..f310cc1 100644 | |
--- app/code/core/Mage/Core/Controller/Front/Action.php | |
+++ app/code/core/Mage/Core/Controller/Front/Action.php | |
@@ -173,9 +173,19 @@ class Mage_Core_Controller_Front_Action extends Mage_Core_Controller_Varien_Acti | |
protected function _validateFormKey() | |
{ | |
$validated = true; | |
- if (Mage::getStoreConfigFlag(self::XML_CSRF_USE_FLAG_CONFIG_PATH)) { | |
+ if ($this->_isFormKeyEnabled()) { | |
$validated = parent::_validateFormKey(); | |
} | |
return $validated; | |
} | |
+ | |
+ /** | |
+ * Check if form key validation is enabled. | |
+ * | |
+ * @return bool | |
+ */ | |
+ protected function _isFormKeyEnabled() | |
+ { | |
+ return Mage::getStoreConfigFlag(self::XML_CSRF_USE_FLAG_CONFIG_PATH); | |
+ } | |
} | |
diff --git app/code/core/Mage/Core/Controller/Varien/Router/Admin.php app/code/core/Mage/Core/Controller/Varien/Router/Admin.php | |
index 0dd89ff..b19aaa1 100644 | |
--- app/code/core/Mage/Core/Controller/Varien/Router/Admin.php | |
+++ app/code/core/Mage/Core/Controller/Varien/Router/Admin.php | |
@@ -131,6 +131,29 @@ class Mage_Core_Controller_Varien_Router_Admin extends Mage_Core_Controller_Vari | |
} | |
/** | |
+ * Add module definition to routes. | |
+ * | |
+ * @param string $frontName | |
+ * @param mixed $moduleName | |
+ * @param string $routeName | |
+ * @return $this | |
+ */ | |
+ public function addModule($frontName, $moduleName, $routeName) | |
+ { | |
+ $isExtensionsCompatibilityMode = (bool)(string)Mage::getConfig()->getNode( | |
+ 'default/admin/security/extensions_compatibility_mode' | |
+ ); | |
+ $configRouterFrontName = (string)Mage::getConfig()->getNode( | |
+ Mage_Adminhtml_Helper_Data::XML_PATH_ADMINHTML_ROUTER_FRONTNAME | |
+ ); | |
+ if ($isExtensionsCompatibilityMode || ($frontName == $configRouterFrontName)) { | |
+ return parent::addModule($frontName, $moduleName, $routeName); | |
+ } else { | |
+ return $this; | |
+ } | |
+ } | |
+ | |
+ /** | |
* Check if current controller instance is allowed in current router. | |
* | |
* @param Mage_Core_Controller_Varien_Action $controllerInstance | |
diff --git app/code/core/Mage/Core/Helper/UnserializeArray.php app/code/core/Mage/Core/Helper/UnserializeArray.php | |
new file mode 100644 | |
index 0000000..2e80ab4 | |
--- /dev/null | |
+++ app/code/core/Mage/Core/Helper/UnserializeArray.php | |
@@ -0,0 +1,46 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Core | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Core unserialize helper | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Core | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+class Mage_Core_Helper_UnserializeArray | |
+{ | |
+ /** | |
+ * @param string $str | |
+ * @return array | |
+ * @throws Exception | |
+ */ | |
+ public function unserialize($str) | |
+ { | |
+ $parser = new Unserialize_Parser(); | |
+ return $parser->unserialize($str); | |
+ } | |
+} | |
diff --git app/code/core/Mage/Core/Model/Email/Template/Filter.php app/code/core/Mage/Core/Model/Email/Template/Filter.php | |
index 8b42400..12afbc4 100644 | |
--- app/code/core/Mage/Core/Model/Email/Template/Filter.php | |
+++ app/code/core/Mage/Core/Model/Email/Template/Filter.php | |
@@ -70,6 +70,12 @@ class Mage_Core_Model_Email_Template_Filter extends Varien_Filter_Template | |
*/ | |
protected $_inlineCssFile = false; | |
+ /** @var Mage_Admin_Model_Variable */ | |
+ protected $_permissionVariable; | |
+ | |
+ /** @var Mage_Admin_Model_Block */ | |
+ protected $_permissionBlock; | |
+ | |
/** | |
* Setup callbacks for filters | |
* | |
@@ -77,6 +83,8 @@ class Mage_Core_Model_Email_Template_Filter extends Varien_Filter_Template | |
public function __construct() | |
{ | |
$this->_modifiers['escape'] = array($this, 'modifierEscape'); | |
+ $this->_permissionVariable = Mage::getModel('admin/variable'); | |
+ $this->_permissionBlock = Mage::getModel('admin/block'); | |
} | |
/** | |
@@ -165,8 +173,10 @@ class Mage_Core_Model_Email_Template_Filter extends Varien_Filter_Template | |
$layout = Mage::app()->getLayout(); | |
if (isset($blockParameters['type'])) { | |
- $type = $blockParameters['type']; | |
- $block = $layout->createBlock($type, null, $blockParameters); | |
+ if ($this->_permissionBlock->isTypeAllowed($blockParameters['type'])) { | |
+ $type = $blockParameters['type']; | |
+ $block = $layout->createBlock($type, null, $blockParameters); | |
+ } | |
} elseif (isset($blockParameters['id'])) { | |
$block = $layout->createBlock('cms/block'); | |
if ($block) { | |
@@ -466,7 +476,7 @@ class Mage_Core_Model_Email_Template_Filter extends Varien_Filter_Template | |
$configValue = ''; | |
$params = $this->_getIncludeParameters($construction[2]); | |
$storeId = $this->getStoreId(); | |
- if (isset($params['path'])) { | |
+ if (isset($params['path']) && $this->_permissionVariable->isPathAllowed($params['path'])) { | |
$configValue = Mage::getStoreConfig($params['path'], $storeId); | |
} | |
return $configValue; | |
diff --git app/code/core/Mage/Core/Model/Resource/Setup.php app/code/core/Mage/Core/Model/Resource/Setup.php | |
index d675029..a24d888 100644 | |
--- app/code/core/Mage/Core/Model/Resource/Setup.php | |
+++ app/code/core/Mage/Core/Model/Resource/Setup.php | |
@@ -641,7 +641,6 @@ class Mage_Core_Model_Resource_Setup | |
$this->_setResourceVersion($actionType, $file['toVersion']); | |
} | |
} catch (Exception $e) { | |
- printf('<pre>%s</pre>', print_r($e, true)); | |
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Error in file: "%s" - %s', $fileName, $e->getMessage())); | |
} | |
$version = $file['toVersion']; | |
diff --git app/code/core/Mage/Core/etc/config.xml app/code/core/Mage/Core/etc/config.xml | |
index 444f830..1c6a70e 100644 | |
--- app/code/core/Mage/Core/etc/config.xml | |
+++ app/code/core/Mage/Core/etc/config.xml | |
@@ -415,6 +415,7 @@ | |
<use_form_key>1</use_form_key> | |
<domain_policy_backend>2</domain_policy_backend> | |
<domain_policy_frontend>2</domain_policy_frontend> | |
+ <extensions_compatibility_mode>1</extensions_compatibility_mode> | |
</security> | |
</admin> | |
<general> | |
diff --git app/code/core/Mage/Core/etc/system.xml app/code/core/Mage/Core/etc/system.xml | |
index c9715cd..1943649 100644 | |
--- app/code/core/Mage/Core/etc/system.xml | |
+++ app/code/core/Mage/Core/etc/system.xml | |
@@ -1188,7 +1188,7 @@ | |
<show_in_website>0</show_in_website> | |
<show_in_store>0</show_in_store> | |
</session_cookie_lifetime> | |
- <domain_policy_backend translate="label"> | |
+ <domain_policy_backend translate="label comment"> | |
<label>Allow Magento Backend to run in frame</label> | |
<frontend_type>select</frontend_type> | |
<comment>Enabling ability to run Magento in a frame is not recommended for security reasons.</comment> | |
@@ -1198,7 +1198,7 @@ | |
<show_in_website>0</show_in_website> | |
<show_in_store>0</show_in_store> | |
</domain_policy_backend> | |
- <domain_policy_frontend translate="label"> | |
+ <domain_policy_frontend translate="label comment"> | |
<label>Allow Magento Frontend to run in frame</label> | |
<comment>Enabling ability to run Magento in a frame is not recommended for security reasons.</comment> | |
<frontend_type>select</frontend_type> | |
@@ -1208,6 +1208,16 @@ | |
<show_in_website>0</show_in_website> | |
<show_in_store>0</show_in_store> | |
</domain_policy_frontend> | |
+ <extensions_compatibility_mode translate="label comment"> | |
+ <label>Admin routing compatibility mode for extensions</label> | |
+ <comment>Enabling this setting increases risk of automated attacks against admin functionality.</comment> | |
+ <frontend_type>select</frontend_type> | |
+ <sort_order>6</sort_order> | |
+ <source_model>adminhtml/system_config_source_enabledisable</source_model> | |
+ <show_in_default>1</show_in_default> | |
+ <show_in_website>0</show_in_website> | |
+ <show_in_store>0</show_in_store> | |
+ </extensions_compatibility_mode> | |
</fields> | |
</security> | |
<dashboard translate="label"> | |
diff --git app/code/core/Mage/Customer/Block/Account/Changeforgotten.php app/code/core/Mage/Customer/Block/Account/Changeforgotten.php | |
new file mode 100644 | |
index 0000000..9c08a7d | |
--- /dev/null | |
+++ app/code/core/Mage/Customer/Block/Account/Changeforgotten.php | |
@@ -0,0 +1,38 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Customer | |
+ * @copyright Copyright (c) 2014 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Customer reset password form | |
+ * | |
+ * @category Mage | |
+ * @package Mage_Customer | |
+ * @author Magento Core Team <[email protected]> | |
+ */ | |
+ | |
+class Mage_Customer_Block_Account_Changeforgotten extends Mage_Core_Block_Template | |
+{ | |
+ | |
+} | |
diff --git app/code/core/Mage/Customer/Block/Account/Resetpassword.php app/code/core/Mage/Customer/Block/Account/Resetpassword.php | |
index f4229ec..2ad31b7 100644 | |
--- app/code/core/Mage/Customer/Block/Account/Resetpassword.php | |
+++ app/code/core/Mage/Customer/Block/Account/Resetpassword.php | |
@@ -32,6 +32,9 @@ | |
* @author Magento Core Team <[email protected]> | |
*/ | |
+/** | |
+ * @deprecated | |
+ */ | |
class Mage_Customer_Block_Account_Resetpassword extends Mage_Core_Block_Template | |
{ | |
diff --git app/code/core/Mage/Customer/controllers/AccountController.php app/code/core/Mage/Customer/controllers/AccountController.php | |
index 27cdb95..19543f7 100644 | |
--- app/code/core/Mage/Customer/controllers/AccountController.php | |
+++ app/code/core/Mage/Customer/controllers/AccountController.php | |
@@ -33,6 +33,9 @@ | |
*/ | |
class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
{ | |
+ const CUSTOMER_ID_SESSION_NAME = "customerId"; | |
+ const TOKEN_SESSION_NAME = "token"; | |
+ | |
/** | |
* Action list where need check enabled cookie | |
* | |
@@ -72,6 +75,7 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
'logoutsuccess', | |
'forgotpassword', | |
'forgotpasswordpost', | |
+ 'changeforgotten', | |
'resetpassword', | |
'resetpasswordpost', | |
'confirm', | |
@@ -268,15 +272,21 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
*/ | |
public function createPostAction() | |
{ | |
+ $errUrl = $this->_getUrl('*/*/create', array('_secure' => true)); | |
+ | |
+ if (!$this->_validateFormKey()) { | |
+ $this->_redirectError($errUrl); | |
+ return; | |
+ } | |
+ | |
/** @var $session Mage_Customer_Model_Session */ | |
$session = $this->_getSession(); | |
if ($session->isLoggedIn()) { | |
$this->_redirect('*/*/'); | |
return; | |
} | |
- $session->setEscapeMessages(true); // prevent XSS injection in user input | |
+ | |
if (!$this->getRequest()->isPost()) { | |
- $errUrl = $this->_getUrl('*/*/create', array('_secure' => true)); | |
$this->_redirectError($errUrl); | |
return; | |
} | |
@@ -300,16 +310,15 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
if ($e->getCode() === Mage_Customer_Model_Customer::EXCEPTION_EMAIL_EXISTS) { | |
$url = $this->_getUrl('customer/account/forgotpassword'); | |
$message = $this->__('There is already an account with this email address. If you are sure that it is your email address, <a href="%s">click here</a> to get your password and access your account.', $url); | |
- $session->setEscapeMessages(false); | |
} else { | |
- $message = $e->getMessage(); | |
+ $message = $this->_escapeHtml($e->getMessage()); | |
} | |
$session->addError($message); | |
} catch (Exception $e) { | |
- $session->setCustomerFormData($this->getRequest()->getPost()) | |
- ->addException($e, $this->__('Cannot save the customer.')); | |
+ $session->setCustomerFormData($this->getRequest()->getPost()); | |
+ $session->addException($e, $this->__('Cannot save the customer.')); | |
} | |
- $errUrl = $this->_getUrl('*/*/create', array('_secure' => true)); | |
+ | |
$this->_redirectError($errUrl); | |
} | |
@@ -377,7 +386,7 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
$session->setCustomerFormData($this->getRequest()->getPost()); | |
if (is_array($errors)) { | |
foreach ($errors as $errorMessage) { | |
- $session->addError($errorMessage); | |
+ $session->addError($this->_escapeHtml($errorMessage)); | |
} | |
} else { | |
$session->addError($this->__('Invalid customer data')); | |
@@ -385,6 +394,17 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
} | |
/** | |
+ * Escape message text HTML. | |
+ * | |
+ * @param string $text | |
+ * @return string | |
+ */ | |
+ protected function _escapeHtml($text) | |
+ { | |
+ return Mage::helper('core')->escapeHtml($text); | |
+ } | |
+ | |
+ /** | |
* Validate customer data and return errors if they are | |
* | |
* @param Mage_Customer_Model_Customer $customer | |
@@ -741,23 +761,39 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
/** | |
* Display reset forgotten password form | |
* | |
- * User is redirected on this action when he clicks on the corresponding link in password reset confirmation email | |
- * | |
*/ | |
- public function resetPasswordAction() | |
+ public function changeForgottenAction() | |
{ | |
- $resetPasswordLinkToken = (string) $this->getRequest()->getQuery('token'); | |
- $customerId = (int) $this->getRequest()->getQuery('id'); | |
try { | |
+ list($customerId, $resetPasswordLinkToken) = $this->_getRestorePasswordParameters($this->_getSession()); | |
$this->_validateResetPasswordLinkToken($customerId, $resetPasswordLinkToken); | |
$this->loadLayout(); | |
- // Pass received parameters to the reset forgotten password form | |
- $this->getLayout()->getBlock('resetPassword') | |
- ->setCustomerId($customerId) | |
- ->setResetPasswordLinkToken($resetPasswordLinkToken); | |
$this->renderLayout(); | |
+ | |
} catch (Exception $exception) { | |
- $this->_getSession()->addError( $this->_getHelper('customer')->__('Your password reset link has expired.')); | |
+ $this->_getSession()->addError($this->_getHelper('customer')->__('Your password reset link has expired.')); | |
+ $this->_redirect('*/*/forgotpassword'); | |
+ } | |
+ } | |
+ | |
+ /** | |
+ * Checks reset forgotten password token | |
+ * | |
+ * User is redirected on this action when he clicks on the corresponding link in password reset confirmation email. | |
+ * | |
+ */ | |
+ public function resetPasswordAction() | |
+ { | |
+ try { | |
+ $customerId = (int)$this->getRequest()->getQuery("id"); | |
+ $resetPasswordLinkToken = (string)$this->getRequest()->getQuery('token'); | |
+ | |
+ $this->_validateResetPasswordLinkToken($customerId, $resetPasswordLinkToken); | |
+ $this->_saveRestorePasswordParameters($customerId, $resetPasswordLinkToken) | |
+ ->_redirect('*/*/changeforgotten'); | |
+ | |
+ } catch (Exception $exception) { | |
+ $this->_getSession()->addError($this->_getHelper('customer')->__('Your password reset link has expired.')); | |
$this->_redirect('*/*/forgotpassword'); | |
} | |
} | |
@@ -768,15 +804,14 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
*/ | |
public function resetPasswordPostAction() | |
{ | |
- $resetPasswordLinkToken = (string) $this->getRequest()->getQuery('token'); | |
- $customerId = (int) $this->getRequest()->getQuery('id'); | |
- $password = (string) $this->getRequest()->getPost('password'); | |
- $passwordConfirmation = (string) $this->getRequest()->getPost('confirmation'); | |
+ list($customerId, $resetPasswordLinkToken) = $this->_getRestorePasswordParameters($this->_getSession()); | |
+ $password = (string)$this->getRequest()->getPost('password'); | |
+ $passwordConfirmation = (string)$this->getRequest()->getPost('confirmation'); | |
try { | |
$this->_validateResetPasswordLinkToken($customerId, $resetPasswordLinkToken); | |
} catch (Exception $exception) { | |
- $this->_getSession()->addError( $this->_getHelper('customer')->__('Your password reset link has expired.')); | |
+ $this->_getSession()->addError($this->_getHelper('customer')->__('Your password reset link has expired.')); | |
$this->_redirect('*/*/'); | |
return; | |
} | |
@@ -800,10 +835,7 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
foreach ($errorMessages as $errorMessage) { | |
$this->_getSession()->addError($errorMessage); | |
} | |
- $this->_redirect('*/*/resetpassword', array( | |
- 'id' => $customerId, | |
- 'token' => $resetPasswordLinkToken | |
- )); | |
+ $this->_redirect('*/*/changeforgotten'); | |
return; | |
} | |
@@ -813,14 +845,15 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
$customer->setRpTokenCreatedAt(null); | |
$customer->cleanPasswordsValidationData(); | |
$customer->save(); | |
- $this->_getSession()->addSuccess( $this->_getHelper('customer')->__('Your password has been updated.')); | |
+ | |
+ $this->_getSession()->unsetData(self::TOKEN_SESSION_NAME); | |
+ $this->_getSession()->unsetData(self::CUSTOMER_ID_SESSION_NAME); | |
+ | |
+ $this->_getSession()->addSuccess($this->_getHelper('customer')->__('Your password has been updated.')); | |
$this->_redirect('*/*/login'); | |
} catch (Exception $exception) { | |
$this->_getSession()->addException($exception, $this->__('Cannot save a new password.')); | |
- $this->_redirect('*/*/resetpassword', array( | |
- 'id' => $customerId, | |
- 'token' => $resetPasswordLinkToken | |
- )); | |
+ $this->_redirect('*/*/changeforgotten'); | |
return; | |
} | |
} | |
@@ -997,4 +1030,34 @@ class Mage_Customer_AccountController extends Mage_Core_Controller_Front_Action | |
{ | |
return $this->_getHelper('customer/address')->isVatValidationEnabled($store); | |
} | |
+ | |
+ /** | |
+ * Get restore password params. | |
+ * | |
+ * @param Mage_Customer_Model_Session $session | |
+ * @return array array ($customerId, $resetPasswordToken) | |
+ */ | |
+ protected function _getRestorePasswordParameters(Mage_Customer_Model_Session $session) | |
+ { | |
+ return array( | |
+ (int) $session->getData(self::CUSTOMER_ID_SESSION_NAME), | |
+ (string) $session->getData(self::TOKEN_SESSION_NAME) | |
+ ); | |
+ } | |
+ | |
+ /** | |
+ * Save restore password params to session. | |
+ * | |
+ * @param int $customerId | |
+ * @param string $resetPasswordLinkToken | |
+ * @return $this | |
+ */ | |
+ protected function _saveRestorePasswordParameters($customerId, $resetPasswordLinkToken) | |
+ { | |
+ $this->_getSession() | |
+ ->setData(self::CUSTOMER_ID_SESSION_NAME, $customerId) | |
+ ->setData(self::TOKEN_SESSION_NAME, $resetPasswordLinkToken); | |
+ | |
+ return $this; | |
+ } | |
} | |
diff --git app/code/core/Mage/Downloadable/Model/Product/Type.php app/code/core/Mage/Downloadable/Model/Product/Type.php | |
index 77b7792..c091970 100644 | |
--- app/code/core/Mage/Downloadable/Model/Product/Type.php | |
+++ app/code/core/Mage/Downloadable/Model/Product/Type.php | |
@@ -178,6 +178,10 @@ class Mage_Downloadable_Model_Product_Type extends Mage_Catalog_Model_Product_Ty | |
unset($sampleItem['file']); | |
} | |
+ if (isset($sampleItem['sample_url'])) { | |
+ $sampleItem['sample_url'] = Mage::helper('core')->escapeUrl($sampleItem['sample_url']); | |
+ } | |
+ | |
$sampleModel->setData($sampleItem) | |
->setSampleType($sampleItem['type']) | |
->setProductId($product->getId()) | |
@@ -220,6 +224,9 @@ class Mage_Downloadable_Model_Product_Type extends Mage_Catalog_Model_Product_Ty | |
$sample = $linkItem['sample']; | |
unset($linkItem['sample']); | |
} | |
+ if (isset($linkItem['link_url'])) { | |
+ $linkItem['link_url'] = Mage::helper('core')->escapeUrl($linkItem['link_url']); | |
+ } | |
$linkModel = Mage::getModel('downloadable/link') | |
->setData($linkItem) | |
->setLinkType($linkItem['type']) | |
@@ -236,7 +243,7 @@ class Mage_Downloadable_Model_Product_Type extends Mage_Catalog_Model_Product_Ty | |
$sampleFile = array(); | |
if ($sample && isset($sample['type'])) { | |
if ($sample['type'] == 'url' && $sample['url'] != '') { | |
- $linkModel->setSampleUrl($sample['url']); | |
+ $linkModel->setSampleUrl(Mage::helper('core')->escapeUrl($sample['url'])); | |
} | |
$linkModel->setSampleType($sample['type']); | |
$sampleFile = Mage::helper('core')->jsonDecode($sample['file']); | |
diff --git app/code/core/Mage/Eav/Model/Resource/Attribute/Collection.php app/code/core/Mage/Eav/Model/Resource/Attribute/Collection.php | |
index 42f9c8f..c412834 100644 | |
--- app/code/core/Mage/Eav/Model/Resource/Attribute/Collection.php | |
+++ app/code/core/Mage/Eav/Model/Resource/Attribute/Collection.php | |
@@ -216,7 +216,9 @@ abstract class Mage_Eav_Model_Resource_Attribute_Collection | |
public function addSystemHiddenFilter() | |
{ | |
$field = '(CASE WHEN additional_table.is_system = 1 AND additional_table.is_visible = 0 THEN 1 ELSE 0 END)'; | |
- return $this->addFieldToFilter($field, 0); | |
+ $resultCondition = $this->_getConditionSql($field, 0); | |
+ $this->_select->where($resultCondition); | |
+ return $this; | |
} | |
/** | |
@@ -228,7 +230,8 @@ abstract class Mage_Eav_Model_Resource_Attribute_Collection | |
{ | |
$field = '(CASE WHEN additional_table.is_system = 1 AND additional_table.is_visible = 0 | |
AND main_table.attribute_code != "' . self::EAV_CODE_PASSWORD_HASH . '" THEN 1 ELSE 0 END)'; | |
- $this->addFieldToFilter($field, 0); | |
+ $resultCondition = $this->_getConditionSql($field, 0); | |
+ $this->_select->where($resultCondition); | |
return $this; | |
} | |
diff --git app/code/core/Mage/Sales/Model/Resource/Order/Item/Collection.php app/code/core/Mage/Sales/Model/Resource/Order/Item/Collection.php | |
index 89ab719..0f8dfba 100644 | |
--- app/code/core/Mage/Sales/Model/Resource/Order/Item/Collection.php | |
+++ app/code/core/Mage/Sales/Model/Resource/Order/Item/Collection.php | |
@@ -139,4 +139,17 @@ class Mage_Sales_Model_Resource_Order_Item_Collection extends Mage_Sales_Model_R | |
} | |
return $this; | |
} | |
+ | |
+ /** | |
+ * Filter only available items. | |
+ * | |
+ * @return Mage_Sales_Model_Resource_Order_Item_Collection | |
+ */ | |
+ public function addAvailableFilter() | |
+ { | |
+ $fieldExpression = '(qty_shipped - qty_returned)'; | |
+ $resultCondition = $this->_getConditionSql($fieldExpression, array("gt" => 0)); | |
+ $this->getSelect()->where($resultCondition); | |
+ return $this; | |
+ } | |
} | |
diff --git app/code/core/Mage/Sales/controllers/DownloadController.php app/code/core/Mage/Sales/controllers/DownloadController.php | |
index 6c50071..c76ed63 100644 | |
--- app/code/core/Mage/Sales/controllers/DownloadController.php | |
+++ app/code/core/Mage/Sales/controllers/DownloadController.php | |
@@ -48,6 +48,8 @@ class Mage_Sales_DownloadController extends Mage_Core_Controller_Front_Action | |
throw new Exception(); | |
} | |
+ $this->_validateFilePath($info); | |
+ | |
$filePath = Mage::getBaseDir() . $info['order_path']; | |
if ((!is_file($filePath) || !is_readable($filePath)) && !$this->_processDatabaseFile($filePath)) { | |
//try get file from quote | |
@@ -66,6 +68,19 @@ class Mage_Sales_DownloadController extends Mage_Core_Controller_Front_Action | |
} | |
/** | |
+ * @param array $info | |
+ * @throws Exception | |
+ */ | |
+ protected function _validateFilePath($info) | |
+ { | |
+ $optionFile = Mage::getModel('catalog/product_option_type_file'); | |
+ $optionStoragePath = $optionFile->getOrderTargetDir(true); | |
+ if (strpos($info['order_path'], $optionStoragePath) !== 0) { | |
+ throw new Exception('Unexpected file path'); | |
+ } | |
+ } | |
+ | |
+ /** | |
* Check file in database storage if needed and place it on file system | |
* | |
* @param string $filePath | |
@@ -176,7 +191,7 @@ class Mage_Sales_DownloadController extends Mage_Core_Controller_Front_Action | |
} | |
try { | |
- $info = unserialize($option->getValue()); | |
+ $info = Mage::helper('core/unserializeArray')->unserialize($option->getValue()); | |
$this->_downloadFileAction($info); | |
} catch (Exception $e) { | |
$this->_forward('noRoute'); | |
diff --git app/code/core/Mage/SalesRule/Model/Resource/Coupon/Collection.php app/code/core/Mage/SalesRule/Model/Resource/Coupon/Collection.php | |
index e392fba..583c368 100644 | |
--- app/code/core/Mage/SalesRule/Model/Resource/Coupon/Collection.php | |
+++ app/code/core/Mage/SalesRule/Model/Resource/Coupon/Collection.php | |
@@ -97,9 +97,9 @@ class Mage_SalesRule_Model_Resource_Coupon_Collection extends Mage_Core_Model_Re | |
public function addIsUsedFilterCallback($collection, $column) | |
{ | |
$filterValue = $column->getFilter()->getCondition(); | |
- $collection->addFieldToFilter( | |
- $this->getConnection()->getCheckSql('main_table.times_used > 0', 1, 0), | |
- array('eq' => $filterValue) | |
- ); | |
+ | |
+ $fieldExpression = $this->getConnection()->getCheckSql('main_table.times_used > 0', 1, 0); | |
+ $resultCondition = $this->_getConditionSql($fieldExpression, array('eq' => $filterValue)); | |
+ $collection->getSelect()->where($resultCondition); | |
} | |
} | |
diff --git app/design/adminhtml/default/default/layout/admin.xml app/design/adminhtml/default/default/layout/admin.xml | |
index 5813b7d..f3a195e 100644 | |
--- app/design/adminhtml/default/default/layout/admin.xml | |
+++ app/design/adminhtml/default/default/layout/admin.xml | |
@@ -39,7 +39,18 @@ | |
<block type="adminhtml/template" name="adminhtml.permissions.user.roles.grid.js" template="permissions/user_roles_grid_js.phtml"/> | |
</reference> | |
</adminhtml_permissions_user_edit> | |
- | |
+ <!-- admin permissions block edit page --> | |
+ <adminhtml_permissions_block_edit> | |
+ <reference name="content"> | |
+ <block type="adminhtml/permissions_block_edit" name="adminhtml.permissions.block.edit"/> | |
+ </reference> | |
+ </adminhtml_permissions_block_edit> | |
+ <!-- admin permissions variable edit page --> | |
+ <adminhtml_permissions_variable_edit> | |
+ <reference name="content"> | |
+ <block type="adminhtml/permissions_variable_edit" name="adminhtml.permissions.variable.edit"/> | |
+ </reference> | |
+ </adminhtml_permissions_variable_edit> | |
<!-- admin acl roles grid page --> | |
<adminhtml_permissions_role_index> | |
<reference name="content"> | |
diff --git app/design/frontend/base/default/layout/customer.xml app/design/frontend/base/default/layout/customer.xml | |
index 0b82186..8a85469 100644 | |
--- app/design/frontend/base/default/layout/customer.xml | |
+++ app/design/frontend/base/default/layout/customer.xml | |
@@ -153,7 +153,7 @@ New customer registration | |
</reference> | |
</customer_account_forgotpassword> | |
- <customer_account_resetpassword translate="label"> | |
+ <customer_account_changeforgotten translate="label"> | |
<label>Reset a Password</label> | |
<remove name="right"/> | |
<remove name="left"/> | |
@@ -172,9 +172,9 @@ New customer registration | |
</action> | |
</reference> | |
<reference name="content"> | |
- <block type="customer/account_resetpassword" name="resetPassword" template="customer/form/resetforgottenpassword.phtml"/> | |
+ <block type="customer/account_changeforgotten" name="changeForgottenPassword" template="customer/form/resetforgottenpassword.phtml"/> | |
</reference> | |
- </customer_account_resetpassword> | |
+ </customer_account_changeforgotten> | |
<customer_account_confirmation> | |
<remove name="right"/> | |
diff --git app/design/frontend/base/default/template/customer/form/register.phtml app/design/frontend/base/default/template/customer/form/register.phtml | |
index bd4e44a..ec20429 100644 | |
--- app/design/frontend/base/default/template/customer/form/register.phtml | |
+++ app/design/frontend/base/default/template/customer/form/register.phtml | |
@@ -43,6 +43,7 @@ | |
<div class="fieldset"> | |
<input type="hidden" name="success_url" value="<?php echo $this->getSuccessUrl() ?>" /> | |
<input type="hidden" name="error_url" value="<?php echo $this->getErrorUrl() ?>" /> | |
+ <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /> | |
<h2 class="legend"><?php echo $this->__('Personal Information') ?></h2> | |
<ul class="form-list"> | |
<li class="fields"> | |
diff --git app/design/frontend/base/default/template/customer/form/resetforgottenpassword.phtml app/design/frontend/base/default/template/customer/form/resetforgottenpassword.phtml | |
index 3611957..691a96d 100644 | |
--- app/design/frontend/base/default/template/customer/form/resetforgottenpassword.phtml | |
+++ app/design/frontend/base/default/template/customer/form/resetforgottenpassword.phtml | |
@@ -28,7 +28,7 @@ | |
<h1><?php echo $this->__('Reset a Password'); ?></h1> | |
</div> | |
<?php echo $this->getMessagesBlock()->toHtml(); ?> | |
-<form action="<?php echo $this->getUrl('*/*/resetpasswordpost', array('_query' => array('id' => $this->getCustomerId(), 'token' => $this->getResetPasswordLinkToken()))); ?>" method="post" id="form-validate"> | |
+<form action="<?php echo $this->getUrl('*/*/resetpasswordpost'); ?>" method="post" id="form-validate"> | |
<div class="fieldset" style="margin-top: 70px;"> | |
<ul class="form-list"> | |
<li class="fields"> | |
diff --git app/design/frontend/base/default/template/persistent/customer/form/register.phtml app/design/frontend/base/default/template/persistent/customer/form/register.phtml | |
index 275f4d2..ccd1ea1 100644 | |
--- app/design/frontend/base/default/template/persistent/customer/form/register.phtml | |
+++ app/design/frontend/base/default/template/persistent/customer/form/register.phtml | |
@@ -42,6 +42,7 @@ | |
<div class="fieldset"> | |
<input type="hidden" name="success_url" value="<?php echo $this->getSuccessUrl() ?>" /> | |
<input type="hidden" name="error_url" value="<?php echo $this->getErrorUrl() ?>" /> | |
+ <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /> | |
<h2 class="legend"><?php echo $this->__('Personal Information') ?></h2> | |
<ul class="form-list"> | |
<li class="fields"> | |
diff --git app/design/frontend/default/iphone/layout/customer.xml app/design/frontend/default/iphone/layout/customer.xml | |
index dd384fc..2da07a4 100644 | |
--- app/design/frontend/default/iphone/layout/customer.xml | |
+++ app/design/frontend/default/iphone/layout/customer.xml | |
@@ -141,7 +141,7 @@ New customer registration | |
</reference> | |
</customer_account_forgotpassword> | |
- <customer_account_resetpassword translate="label"> | |
+ <customer_account_changeforgotten translate="label"> | |
<label>Reset a Password</label> | |
<remove name="right"/> | |
<remove name="left"/> | |
@@ -160,9 +160,9 @@ New customer registration | |
</action> | |
</reference> | |
<reference name="content"> | |
- <block type="customer/account_resetpassword" name="resetPassword" template="customer/form/resetforgottenpassword.phtml"/> | |
+ <block type="customer/account_changeforgotten" name="changeForgottenPassword" template="customer/form/resetforgottenpassword.phtml"/> | |
</reference> | |
- </customer_account_resetpassword> | |
+ </customer_account_changeforgotten> | |
<customer_account_confirmation> | |
<remove name="right"/> | |
diff --git app/design/frontend/default/modern/layout/customer.xml app/design/frontend/default/modern/layout/customer.xml | |
index fb94b09..42a6574 100644 | |
--- app/design/frontend/default/modern/layout/customer.xml | |
+++ app/design/frontend/default/modern/layout/customer.xml | |
@@ -156,7 +156,7 @@ New customer registration | |
</reference> | |
</customer_account_forgotpassword> | |
- <customer_account_resetpassword translate="label"> | |
+ <customer_account_changeforgotten translate="label"> | |
<label>Reset a Password</label> | |
<remove name="right"/> | |
<remove name="left"/> | |
@@ -175,9 +175,9 @@ New customer registration | |
</action> | |
</reference> | |
<reference name="content"> | |
- <block type="customer/account_resetpassword" name="resetPassword" template="customer/form/resetforgottenpassword.phtml"/> | |
+ <block type="customer/account_changeforgotten" name="changeForgottenPassword" template="customer/form/resetforgottenpassword.phtml"/> | |
</reference> | |
- </customer_account_resetpassword> | |
+ </customer_account_changeforgotten> | |
<customer_account_confirmation> | |
<remove name="right"/> | |
diff --git app/design/frontend/rwd/default/layout/customer.xml app/design/frontend/rwd/default/layout/customer.xml | |
index 271fc88..60deace 100644 | |
--- app/design/frontend/rwd/default/layout/customer.xml | |
+++ app/design/frontend/rwd/default/layout/customer.xml | |
@@ -158,7 +158,7 @@ New customer registration | |
</reference> | |
</customer_account_forgotpassword> | |
- <customer_account_resetpassword translate="label"> | |
+ <customer_account_changeforgotten translate="label"> | |
<label>Reset a Password</label> | |
<remove name="right"/> | |
<remove name="left"/> | |
@@ -177,9 +177,9 @@ New customer registration | |
</action> | |
</reference> | |
<reference name="content"> | |
- <block type="customer/account_resetpassword" name="resetPassword" template="customer/form/resetforgottenpassword.phtml"/> | |
+ <block type="customer/account_changeforgotten" name="changeForgottenPassword" template="customer/form/resetforgottenpassword.phtml"/> | |
</reference> | |
- </customer_account_resetpassword> | |
+ </customer_account_changeforgotten> | |
<customer_account_confirmation> | |
<remove name="right"/> | |
diff --git app/design/frontend/rwd/default/template/customer/form/resetforgottenpassword.phtml app/design/frontend/rwd/default/template/customer/form/resetforgottenpassword.phtml | |
index e7c05d9..79c186e 100644 | |
--- app/design/frontend/rwd/default/template/customer/form/resetforgottenpassword.phtml | |
+++ app/design/frontend/rwd/default/template/customer/form/resetforgottenpassword.phtml | |
@@ -28,7 +28,7 @@ | |
<h1><?php echo $this->__('Reset a Password'); ?></h1> | |
</div> | |
<?php echo $this->getMessagesBlock()->toHtml(); ?> | |
-<form action="<?php echo $this->getUrl('*/*/resetpasswordpost', array('_query' => array('id' => $this->getCustomerId(), 'token' => $this->getResetPasswordLinkToken()))); ?>" method="post" id="form-validate" class="scaffold-form"> | |
+<form action="<?php echo $this->getUrl('*/*/resetpasswordpost'); ?>" method="post" id="form-validate" class="scaffold-form"> | |
<div class="fieldset" style="margin-top: 70px;"> | |
<p class="required"><?php echo $this->__('* Required Fields'); ?></p> | |
<ul class="form-list"> | |
diff --git app/design/frontend/rwd/default/template/persistent/customer/form/register.phtml app/design/frontend/rwd/default/template/persistent/customer/form/register.phtml | |
index 8557051..04df755 100644 | |
--- app/design/frontend/rwd/default/template/persistent/customer/form/register.phtml | |
+++ app/design/frontend/rwd/default/template/persistent/customer/form/register.phtml | |
@@ -42,6 +42,7 @@ | |
<div class="fieldset"> | |
<input type="hidden" name="success_url" value="<?php echo $this->getSuccessUrl() ?>" /> | |
<input type="hidden" name="error_url" value="<?php echo $this->getErrorUrl() ?>" /> | |
+ <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /> | |
<p class="form-instructions"><?php echo $this->__('Please enter the following information to create your account.') ?></p> | |
<p class="required"><?php echo $this->__('* Required Fields') ?></p> | |
<ul class="form-list"> | |
diff --git cron.php cron.php | |
index e191694..1e9ef3b 100644 | |
--- cron.php | |
+++ cron.php | |
@@ -60,10 +60,11 @@ try { | |
Mage::throwException('Unrecognized cron mode was defined'); | |
} | |
} else if (!$isShellDisabled) { | |
- $fileName = basename(__FILE__); | |
- $baseDir = dirname(__FILE__); | |
- shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &"); | |
- shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &"); | |
+ $fileName = escapeshellarg(basename(__FILE__)); | |
+ $cronPath = escapeshellarg(dirname(__FILE__) . '/cron.sh'); | |
+ | |
+ shell_exec(escapeshellcmd("/bin/sh $cronPath $fileName -mdefault 1 > /dev/null 2>&1 &")); | |
+ shell_exec(escapeshellcmd("/bin/sh $cronPath $fileName -malways 1 > /dev/null 2>&1 &")); | |
exit; | |
} | |
} | |
diff --git dev/tests/functional/.htaccess dev/tests/functional/.htaccess | |
deleted file mode 100644 | |
index 0a28bda..0000000 | |
--- dev/tests/functional/.htaccess | |
+++ /dev/null | |
@@ -1,194 +0,0 @@ | |
-############################################ | |
-## uncomment these lines for CGI mode | |
-## make sure to specify the correct cgi php binary file name | |
-## it might be /cgi-bin/php-cgi | |
- | |
-# Action php5-cgi /cgi-bin/php5-cgi | |
-# AddHandler php5-cgi .php | |
- | |
-############################################ | |
-## GoDaddy specific options | |
- | |
-# Options -MultiViews | |
- | |
-## you might also need to add this line to php.ini | |
-## cgi.fix_pathinfo = 1 | |
-## if it still doesn't work, rename php.ini to php5.ini | |
- | |
-############################################ | |
-## this line is specific for 1and1 hosting | |
- | |
- #AddType x-mapp-php5 .php | |
- #AddHandler x-mapp-php5 .php | |
- | |
-############################################ | |
-## default index file | |
- | |
- DirectoryIndex index.php | |
- | |
-<IfModule mod_php5.c> | |
- | |
-############################################ | |
-## adjust memory limit | |
- | |
-# php_value memory_limit 64M | |
- php_value memory_limit 256M | |
- php_value max_execution_time 18000 | |
- | |
-############################################ | |
-## disable magic quotes for php request vars | |
- | |
- php_flag magic_quotes_gpc off | |
- | |
-############################################ | |
-## disable automatic session start | |
-## before autoload was initialized | |
- | |
- php_flag session.auto_start off | |
- | |
-############################################ | |
-## enable resulting html compression | |
- | |
- #php_flag zlib.output_compression on | |
- | |
-########################################### | |
-# disable user agent verification to not break multiple image upload | |
- | |
- php_flag suhosin.session.cryptua off | |
- | |
-########################################### | |
-# turn off compatibility with PHP4 when dealing with objects | |
- | |
- php_flag zend.ze1_compatibility_mode Off | |
- | |
-</IfModule> | |
- | |
-<IfModule mod_security.c> | |
-########################################### | |
-# disable POST processing to not break multiple image upload | |
- | |
- SecFilterEngine Off | |
- SecFilterScanPOST Off | |
-</IfModule> | |
- | |
-<IfModule mod_deflate.c> | |
- | |
-############################################ | |
-## enable apache served files compression | |
-## http://developer.yahoo.com/performance/rules.html#gzip | |
- | |
- # Insert filter on all content | |
- ###SetOutputFilter DEFLATE | |
- # Insert filter on selected content types only | |
- #AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript | |
- | |
- # Netscape 4.x has some problems... | |
- #BrowserMatch ^Mozilla/4 gzip-only-text/html | |
- | |
- # Netscape 4.06-4.08 have some more problems | |
- #BrowserMatch ^Mozilla/4\.0[678] no-gzip | |
- | |
- # MSIE masquerades as Netscape, but it is fine | |
- #BrowserMatch \bMSIE !no-gzip !gzip-only-text/html | |
- | |
- # Don't compress images | |
- #SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary | |
- | |
- # Make sure proxies don't deliver the wrong content | |
- #Header append Vary User-Agent env=!dont-vary | |
- | |
-</IfModule> | |
- | |
-<IfModule mod_ssl.c> | |
- | |
-############################################ | |
-## make HTTPS env vars available for CGI mode | |
- | |
- SSLOptions StdEnvVars | |
- | |
-</IfModule> | |
- | |
-<IfModule mod_rewrite.c> | |
- | |
-############################################ | |
-## enable rewrites | |
- | |
- Options +FollowSymLinks | |
- RewriteEngine on | |
- | |
-############################################ | |
-## you can put here your magento root folder | |
-## path relative to web root | |
- | |
- #RewriteBase /magento/ | |
- | |
-############################################ | |
-## workaround for HTTP authorization | |
-## in CGI environment | |
- | |
- RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] | |
- | |
-############################################ | |
-## TRACE and TRACK HTTP methods disabled to prevent XSS attacks | |
- | |
- RewriteCond %{REQUEST_METHOD} ^TRAC[EK] | |
- RewriteRule .* - [L,R=405] | |
- | |
-############################################ | |
-## redirect for mobile user agents | |
- | |
- #RewriteCond %{REQUEST_URI} !^/mobiledirectoryhere/.*$ | |
- #RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC] | |
- #RewriteRule ^(.*)$ /mobiledirectoryhere/ [L,R=302] | |
- | |
-############################################ | |
-## never rewrite for existing files, directories and links | |
- | |
- RewriteCond %{REQUEST_FILENAME} !-f | |
- RewriteCond %{REQUEST_FILENAME} !-d | |
- RewriteCond %{REQUEST_FILENAME} !-l | |
- | |
-############################################ | |
-## rewrite everything else to index.php | |
- | |
- RewriteRule .* index.php [L] | |
- | |
-</IfModule> | |
- | |
- | |
-############################################ | |
-## Prevent character encoding issues from server overrides | |
-## If you still have problems, use the second line instead | |
- | |
- AddDefaultCharset Off | |
- #AddDefaultCharset UTF-8 | |
- | |
-<IfModule mod_expires.c> | |
- | |
-############################################ | |
-## Add default Expires header | |
-## http://developer.yahoo.com/performance/rules.html#expires | |
- | |
- ExpiresDefault "access plus 1 year" | |
- | |
-</IfModule> | |
- | |
-############################################ | |
-## By default allow all access | |
- | |
- Order allow,deny | |
- Allow from all | |
- | |
-########################################### | |
-## Deny access to release notes to prevent disclosure of the installed Magento version | |
- | |
- <Files RELEASE_NOTES.txt> | |
- order allow,deny | |
- deny from all | |
- </Files> | |
- | |
-############################################ | |
-## If running in cluster environment, uncomment this | |
-## http://developer.yahoo.com/performance/rules.html#etags | |
- | |
- #FileETag none | |
diff --git errors/processor.php errors/processor.php | |
index 5ae49e2..450bc68 100644 | |
--- errors/processor.php | |
+++ errors/processor.php | |
@@ -463,6 +463,7 @@ class Error_Processor | |
@mkdir($this->_reportDir, 0750, true); | |
} | |
+ $reportData = array_map('strip_tags', $reportData); | |
@file_put_contents($this->_reportFile, serialize($reportData)); | |
@chmod($this->_reportFile, 0640); | |
diff --git lib/Unserialize/Parser.php lib/Unserialize/Parser.php | |
new file mode 100644 | |
index 0000000..423902a | |
--- /dev/null | |
+++ lib/Unserialize/Parser.php | |
@@ -0,0 +1,61 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Unserialize | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Unserialize_Parser | |
+ */ | |
+class Unserialize_Parser | |
+{ | |
+ const TYPE_STRING = 's'; | |
+ const TYPE_INT = 'i'; | |
+ const TYPE_DOUBLE = 'd'; | |
+ const TYPE_ARRAY = 'a'; | |
+ const TYPE_BOOL = 'b'; | |
+ | |
+ const SYMBOL_QUOTE = '"'; | |
+ const SYMBOL_SEMICOLON = ';'; | |
+ const SYMBOL_COLON = ':'; | |
+ | |
+ /** | |
+ * @param $str | |
+ * @return array|null | |
+ * @throws Exception | |
+ */ | |
+ public function unserialize($str) | |
+ { | |
+ $reader = new Unserialize_Reader_Arr(); | |
+ $prevChar = null; | |
+ for ($i = 0; $i < strlen($str); $i++) { | |
+ $char = $str[$i]; | |
+ $arr = $reader->read($char, $prevChar); | |
+ if (!is_null($arr)) { | |
+ return $arr; | |
+ } | |
+ $prevChar = $char; | |
+ } | |
+ throw new Exception('Error during unserialization'); | |
+ } | |
+} | |
diff --git lib/Unserialize/Reader/Arr.php lib/Unserialize/Reader/Arr.php | |
new file mode 100644 | |
index 0000000..caa979e | |
--- /dev/null | |
+++ lib/Unserialize/Reader/Arr.php | |
@@ -0,0 +1,122 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Unserialize | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Unserialize_Reader_Arr | |
+ */ | |
+class Unserialize_Reader_Arr | |
+{ | |
+ /** | |
+ * @var array | |
+ */ | |
+ protected $_result = null; | |
+ | |
+ /** | |
+ * @var string|int | |
+ */ | |
+ protected $_length = ''; | |
+ | |
+ /** | |
+ * @var int|null | |
+ */ | |
+ protected $_status = null; | |
+ | |
+ /** | |
+ * @var object | |
+ */ | |
+ protected $_reader = null; | |
+ | |
+ const READING_LENGTH = 1; | |
+ const FINISHED_LENGTH = 2; | |
+ const READING_KEY = 3; | |
+ const READING_VALUE = 4; | |
+ const FINISHED_ARR = 5; | |
+ | |
+ /** | |
+ * @param $char | |
+ * @param $prevChar | |
+ * @return array|null | |
+ * @throws Exception | |
+ */ | |
+ public function read($char, $prevChar) | |
+ { | |
+ $this->_result = !is_null($this->_result) ? $this->_result : array(); | |
+ | |
+ if (is_null($this->_status) && $prevChar == Unserialize_Parser::SYMBOL_COLON) { | |
+ $this->_length .= $char; | |
+ $this->_status = self::READING_LENGTH; | |
+ return null; | |
+ } | |
+ | |
+ if ($this->_status == self::READING_LENGTH) { | |
+ if ($char == Unserialize_Parser::SYMBOL_COLON) { | |
+ $this->_length = (int)$this->_length; | |
+ if ($this->_length == 0) { | |
+ $this->_status = self::FINISHED_ARR; | |
+ return null; | |
+ } | |
+ $this->_status = self::FINISHED_LENGTH; | |
+ } else { | |
+ $this->_length .= $char; | |
+ } | |
+ } | |
+ | |
+ if ($this->_status == self::FINISHED_LENGTH && $prevChar == '{') { | |
+ $this->_reader = new Unserialize_Reader_ArrKey(); | |
+ $this->_status = self::READING_KEY; | |
+ } | |
+ | |
+ if ($this->_status == self::READING_KEY) { | |
+ $key = $this->_reader->read($char, $prevChar); | |
+ if (!is_null($key)) { | |
+ $this->_status = self::READING_VALUE; | |
+ $this->_reader = new Unserialize_Reader_ArrValue($key); | |
+ return null; | |
+ } | |
+ } | |
+ | |
+ if ($this->_status == self::READING_VALUE) { | |
+ $value = $this->_reader->read($char, $prevChar); | |
+ if (!is_null($value)) { | |
+ $this->_result[$this->_reader->key] = $value; | |
+ if (count($this->_result) < $this->_length) { | |
+ $this->_reader = new Unserialize_Reader_ArrKey(); | |
+ $this->_status = self::READING_KEY; | |
+ return null; | |
+ } else { | |
+ $this->_status = self::FINISHED_ARR; | |
+ return null; | |
+ } | |
+ } | |
+ } | |
+ | |
+ if ($this->_status == self::FINISHED_ARR) { | |
+ if ($char == '}') { | |
+ return $this->_result; | |
+ } | |
+ } | |
+ } | |
+} | |
diff --git lib/Unserialize/Reader/ArrKey.php lib/Unserialize/Reader/ArrKey.php | |
new file mode 100644 | |
index 0000000..830e928 | |
--- /dev/null | |
+++ lib/Unserialize/Reader/ArrKey.php | |
@@ -0,0 +1,84 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Unserialize | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Unserialize_Reader_ArrKey | |
+ */ | |
+class Unserialize_Reader_ArrKey | |
+{ | |
+ /** | |
+ * @var int | |
+ */ | |
+ protected $_status; | |
+ | |
+ /** | |
+ * @object | |
+ */ | |
+ protected $_reader; | |
+ | |
+ const NOT_STARTED = 1; | |
+ const READING_KEY = 2; | |
+ | |
+ /** | |
+ * Construct | |
+ */ | |
+ public function __construct() | |
+ { | |
+ $this->_status = self::NOT_STARTED; | |
+ } | |
+ | |
+ /** | |
+ * @param string $char | |
+ * @param string $prevChar | |
+ * @return mixed|null | |
+ * @throws Exception | |
+ */ | |
+ public function read($char, $prevChar) | |
+ { | |
+ if ($this->_status == self::NOT_STARTED) { | |
+ switch ($char) { | |
+ case Unserialize_Parser::TYPE_STRING: | |
+ $this->_reader = new Unserialize_Reader_Str(); | |
+ $this->_status = self::READING_KEY; | |
+ break; | |
+ case Unserialize_Parser::TYPE_INT: | |
+ $this->_reader = new Unserialize_Reader_Int(); | |
+ $this->_status = self::READING_KEY; | |
+ break; | |
+ default: | |
+ throw new Exception('Unsupported data type ' . $char); | |
+ } | |
+ } | |
+ | |
+ if ($this->_status == self::READING_KEY) { | |
+ $key = $this->_reader->read($char, $prevChar); | |
+ if (!is_null($key)) { | |
+ return $key; | |
+ } | |
+ } | |
+ return null; | |
+ } | |
+} | |
diff --git lib/Unserialize/Reader/ArrValue.php lib/Unserialize/Reader/ArrValue.php | |
new file mode 100644 | |
index 0000000..d2a4937 | |
--- /dev/null | |
+++ lib/Unserialize/Reader/ArrValue.php | |
@@ -0,0 +1,100 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Unserialize | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Unserialize_Reader_ArrValue | |
+ */ | |
+class Unserialize_Reader_ArrValue | |
+{ | |
+ | |
+ /** | |
+ * @var | |
+ */ | |
+ public $key; | |
+ | |
+ /** | |
+ * @var int | |
+ */ | |
+ protected $_status; | |
+ | |
+ /** | |
+ * @object | |
+ */ | |
+ protected $_reader; | |
+ | |
+ const NOT_STARTED = 1; | |
+ const READING_VALUE = 2; | |
+ | |
+ public function __construct($key) | |
+ { | |
+ $this->_status = self::NOT_STARTED; | |
+ $this->key = $key; | |
+ } | |
+ | |
+ /** | |
+ * @param string $char | |
+ * @param string $prevChar | |
+ * @return mixed|null | |
+ * @throws Exception | |
+ */ | |
+ public function read($char, $prevChar) | |
+ { | |
+ if ($this->_status == self::NOT_STARTED) { | |
+ switch ($char) { | |
+ case Unserialize_Parser::TYPE_STRING: | |
+ $this->_reader = new Unserialize_Reader_Str(); | |
+ $this->_status = self::READING_VALUE; | |
+ break; | |
+ case Unserialize_Parser::TYPE_ARRAY: | |
+ $this->_reader = new Unserialize_Reader_Arr(); | |
+ $this->_status = self::READING_VALUE; | |
+ break; | |
+ case Unserialize_Parser::TYPE_INT: | |
+ $this->_reader = new Unserialize_Reader_Int(); | |
+ $this->_status = self::READING_VALUE; | |
+ break; | |
+ case Unserialize_Parser::TYPE_BOOL: | |
+ $this->_reader = new Unserialize_Reader_Bool(); | |
+ $this->_status = self::READING_VALUE; | |
+ break; | |
+ case Unserialize_Parser::TYPE_DOUBLE: | |
+ $this->_reader = new Unserialize_Reader_Dbl(); | |
+ $this->_status = self::READING_VALUE; | |
+ break; | |
+ default: | |
+ throw new Exception('Unsupported data type ' . $char); | |
+ } | |
+ } | |
+ | |
+ if ($this->_status == self::READING_VALUE) { | |
+ $value = $this->_reader->read($char, $prevChar); | |
+ if (!is_null($value)) { | |
+ return $value; | |
+ } | |
+ } | |
+ return null; | |
+ } | |
+} | |
diff --git lib/Unserialize/Reader/Bool.php lib/Unserialize/Reader/Bool.php | |
new file mode 100644 | |
index 0000000..5e1a132 | |
--- /dev/null | |
+++ lib/Unserialize/Reader/Bool.php | |
@@ -0,0 +1,66 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Unserialize | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Unserialize_Reader_Int | |
+ */ | |
+class Unserialize_Reader_Bool | |
+{ | |
+ /** | |
+ * @var int | |
+ */ | |
+ protected $_status; | |
+ | |
+ /** | |
+ * @var string|int | |
+ */ | |
+ protected $_value; | |
+ | |
+ const READING_VALUE = 1; | |
+ | |
+ /** | |
+ * @param string $char | |
+ * @param string $prevChar | |
+ * @return int|null | |
+ */ | |
+ public function read($char, $prevChar) | |
+ { | |
+ if ($prevChar == Unserialize_Parser::SYMBOL_COLON) { | |
+ $this->_value .= $char; | |
+ $this->_status = self::READING_VALUE; | |
+ return null; | |
+ } | |
+ | |
+ if ($this->_status == self::READING_VALUE) { | |
+ if ($char !== Unserialize_Parser::SYMBOL_SEMICOLON) { | |
+ $this->_value .= $char; | |
+ } else { | |
+ return (bool)$this->_value; | |
+ } | |
+ } | |
+ return null; | |
+ } | |
+} | |
diff --git lib/Unserialize/Reader/Dbl.php lib/Unserialize/Reader/Dbl.php | |
new file mode 100644 | |
index 0000000..48367c8 | |
--- /dev/null | |
+++ lib/Unserialize/Reader/Dbl.php | |
@@ -0,0 +1,66 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Unserialize | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Unserialize_Reader_Dbl | |
+ */ | |
+class Unserialize_Reader_Dbl | |
+{ | |
+ /** | |
+ * @var int | |
+ */ | |
+ protected $_status; | |
+ | |
+ /** | |
+ * @var string|int | |
+ */ | |
+ protected $_value; | |
+ | |
+ const READING_VALUE = 1; | |
+ | |
+ /** | |
+ * @param string $char | |
+ * @param string $prevChar | |
+ * @return float|null | |
+ */ | |
+ public function read($char, $prevChar) | |
+ { | |
+ if ($prevChar == Unserialize_Parser::SYMBOL_COLON) { | |
+ $this->_value .= $char; | |
+ $this->_status = self::READING_VALUE; | |
+ return null; | |
+ } | |
+ | |
+ if ($this->_status == self::READING_VALUE) { | |
+ if ($char !== Unserialize_Parser::SYMBOL_SEMICOLON) { | |
+ $this->_value .= $char; | |
+ } else { | |
+ return (float)$this->_value; | |
+ } | |
+ } | |
+ return null; | |
+ } | |
+} | |
diff --git lib/Unserialize/Reader/Int.php lib/Unserialize/Reader/Int.php | |
new file mode 100644 | |
index 0000000..7bf6c40 | |
--- /dev/null | |
+++ lib/Unserialize/Reader/Int.php | |
@@ -0,0 +1,66 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Unserialize | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Unserialize_Reader_Int | |
+ */ | |
+class Unserialize_Reader_Int | |
+{ | |
+ /** | |
+ * @var int | |
+ */ | |
+ protected $_status; | |
+ | |
+ /** | |
+ * @var string|int | |
+ */ | |
+ protected $_value; | |
+ | |
+ const READING_VALUE = 1; | |
+ | |
+ /** | |
+ * @param string $char | |
+ * @param string $prevChar | |
+ * @return int|null | |
+ */ | |
+ public function read($char, $prevChar) | |
+ { | |
+ if ($prevChar == Unserialize_Parser::SYMBOL_COLON) { | |
+ $this->_value .= $char; | |
+ $this->_status = self::READING_VALUE; | |
+ return null; | |
+ } | |
+ | |
+ if ($this->_status == self::READING_VALUE) { | |
+ if ($char !== Unserialize_Parser::SYMBOL_SEMICOLON) { | |
+ $this->_value .= $char; | |
+ } else { | |
+ return (int)$this->_value; | |
+ } | |
+ } | |
+ return null; | |
+ } | |
+} | |
diff --git lib/Unserialize/Reader/Str.php lib/Unserialize/Reader/Str.php | |
new file mode 100644 | |
index 0000000..e62b38f | |
--- /dev/null | |
+++ lib/Unserialize/Reader/Str.php | |
@@ -0,0 +1,93 @@ | |
+<?php | |
+/** | |
+ * Magento | |
+ * | |
+ * NOTICE OF LICENSE | |
+ * | |
+ * This source file is subject to the Open Software License (OSL 3.0) | |
+ * that is bundled with this package in the file LICENSE.txt. | |
+ * It is also available through the world-wide-web at this URL: | |
+ * http://opensource.org/licenses/osl-3.0.php | |
+ * If you did not receive a copy of the license and are unable to | |
+ * obtain it through the world-wide-web, please send an email | |
+ * to [email protected] so we can send you a copy immediately. | |
+ * | |
+ * DISCLAIMER | |
+ * | |
+ * Do not edit or add to this file if you wish to upgrade Magento to newer | |
+ * versions in the future. If you wish to customize Magento for your | |
+ * needs please refer to http://www.magentocommerce.com for more information. | |
+ * | |
+ * @category Mage | |
+ * @package Unserialize | |
+ * @copyright Copyright (c) 2015 Magento Inc. (http://www.magentocommerce.com) | |
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
+ */ | |
+ | |
+/** | |
+ * Class Unserialize_Reader_Str | |
+ */ | |
+class Unserialize_Reader_Str | |
+{ | |
+ /** | |
+ * @var int|null | |
+ */ | |
+ protected $_status = null; | |
+ | |
+ /** | |
+ * @var int|string | |
+ */ | |
+ protected $_length; | |
+ | |
+ /** | |
+ * @var string | |
+ */ | |
+ protected $_value; | |
+ | |
+ const READING_LENGTH = 1; | |
+ const FINISHED_LENGTH = 2; | |
+ const READING_VALUE = 3; | |
+ | |
+ /** | |
+ * @param string $char | |
+ * @param string $prevChar | |
+ * @return null|string | |
+ */ | |
+ public function read($char, $prevChar) | |
+ { | |
+ | |
+ if (is_null($this->_status) && $prevChar == Unserialize_Parser::SYMBOL_COLON) { | |
+ $this->_status = self::READING_LENGTH; | |
+ } | |
+ | |
+ if ($this->_status == self::READING_LENGTH) { | |
+ if ($char != Unserialize_Parser::SYMBOL_COLON) { | |
+ $this->_length .= $char; | |
+ } else { | |
+ $this->_length = (int)$this->_length; | |
+ $this->_status = self::FINISHED_LENGTH; | |
+ } | |
+ } | |
+ | |
+ if ($this->_status == self::FINISHED_LENGTH) { | |
+ if ($char == Unserialize_Parser::SYMBOL_QUOTE) { | |
+ $this->_status = self::READING_VALUE; | |
+ return null; | |
+ } | |
+ } | |
+ | |
+ if ($this->_status == self::READING_VALUE) { | |
+ if (strlen($this->_value) < $this->_length) { | |
+ $this->_value .= $char; | |
+ return null; | |
+ } | |
+ | |
+ if (strlen($this->_value) == $this->_length) { | |
+ if ($char == Unserialize_Parser::SYMBOL_SEMICOLON && $prevChar == Unserialize_Parser::SYMBOL_QUOTE) { | |
+ return (string)$this->_value; | |
+ } | |
+ } | |
+ } | |
+ return null; | |
+ } | |
+} | |
diff --git lib/Varien/Data/Collection/Db.php lib/Varien/Data/Collection/Db.php | |
index fcd4d8d..6bb52e7 100644 | |
--- lib/Varien/Data/Collection/Db.php | |
+++ lib/Varien/Data/Collection/Db.php | |
@@ -410,8 +410,14 @@ class Varien_Data_Collection_Db extends Varien_Data_Collection | |
*/ | |
protected function _translateCondition($field, $condition) | |
{ | |
- $field = $this->_getMappedField($field); | |
- return $this->_getConditionSql($field, $condition); | |
+ $mappedField = $this->_getMappedField($field); | |
+ | |
+ $quotedField = $mappedField; | |
+ if ($mappedField === $field) { | |
+ $quotedField = $this->getConnection()->quoteIdentifier($field); | |
+ } | |
+ | |
+ return $this->_getConditionSql($quotedField, $condition); | |
} | |
/** | |
@@ -474,7 +480,7 @@ class Varien_Data_Collection_Db extends Varien_Data_Collection | |
* If non matched - sequential array is expected and OR conditions | |
* will be built using above mentioned structure | |
* | |
- * @param string $fieldName | |
+ * @param string $fieldName Field name must be already escaped with Varien_Db_Adapter_Interface::quoteIdentifier() | |
* @param integer|string|array $condition | |
* @return string | |
*/ | |
diff --git lib/Zend/Xml/Security.php lib/Zend/Xml/Security.php | |
index 29e55ca..dbcf1ec 100644 | |
--- lib/Zend/Xml/Security.php | |
+++ lib/Zend/Xml/Security.php | |
@@ -34,13 +34,14 @@ class Zend_Xml_Security | |
* Heuristic scan to detect entity in XML | |
* | |
* @param string $xml | |
- * @throws Zend_Xml_Exception | |
+ * @throws Zend_Xml_Exception If entity expansion or external entity declaration was discovered. | |
*/ | |
protected static function heuristicScan($xml) | |
{ | |
- if (strpos($xml, '<!ENTITY') !== false) { | |
- #require_once 'Exception.php'; | |
- throw new Zend_Xml_Exception(self::ENTITY_DETECT); | |
+ foreach (self::getEntityComparison($xml) as $compare) { | |
+ if (strpos($xml, $compare) !== false) { | |
+ throw new Zend_Xml_Exception(self::ENTITY_DETECT); | |
+ } | |
} | |
} | |
@@ -93,13 +94,12 @@ class Zend_Xml_Security | |
$result = $dom->loadXml($xml, LIBXML_NONET); | |
restore_error_handler(); | |
- // Entity load to previous setting | |
- if (!self::isPhpFpm()) { | |
- libxml_disable_entity_loader($loadEntities); | |
- libxml_use_internal_errors($useInternalXmlErrors); | |
- } | |
- | |
if (!$result) { | |
+ // Entity load to previous setting | |
+ if (!self::isPhpFpm()) { | |
+ libxml_disable_entity_loader($loadEntities); | |
+ libxml_use_internal_errors($useInternalXmlErrors); | |
+ } | |
return false; | |
} | |
@@ -115,6 +115,12 @@ class Zend_Xml_Security | |
} | |
} | |
+ // Entity load to previous setting | |
+ if (!self::isPhpFpm()) { | |
+ libxml_disable_entity_loader($loadEntities); | |
+ libxml_use_internal_errors($useInternalXmlErrors); | |
+ } | |
+ | |
if (isset($simpleXml)) { | |
$result = simplexml_import_dom($dom); | |
if (!$result instanceof SimpleXMLElement) { | |
@@ -147,13 +153,336 @@ class Zend_Xml_Security | |
/** | |
* Return true if PHP is running with PHP-FPM | |
* | |
+ * This method is mainly used to determine whether or not heuristic checks | |
+ * (vs libxml checks) should be made, due to threading issues in libxml; | |
+ * under php-fpm, threading becomes a concern. | |
+ * | |
+ * However, PHP versions 5.5.22+ and 5.6.6+ contain a patch to the | |
+ * libxml support in PHP that makes the libxml checks viable; in such | |
+ * versions, this method will return false to enforce those checks, which | |
+ * are more strict and accurate than the heuristic checks. | |
+ * | |
* @return boolean | |
*/ | |
public static function isPhpFpm() | |
{ | |
- if (substr(php_sapi_name(), 0, 3) === 'fpm') { | |
+ $isVulnerableVersion = ( | |
+ version_compare(PHP_VERSION, '5.5.22', 'lt') | |
+ || ( | |
+ version_compare(PHP_VERSION, '5.6', 'gte') | |
+ && version_compare(PHP_VERSION, '5.6.6', 'lt') | |
+ ) | |
+ ); | |
+ | |
+ if (substr(php_sapi_name(), 0, 3) === 'fpm' && $isVulnerableVersion) { | |
return true; | |
} | |
return false; | |
} | |
+ | |
+ /** | |
+ * Determine and return the string(s) to use for the <!ENTITY comparison. | |
+ * | |
+ * @param string $xml | |
+ * @return string[] | |
+ */ | |
+ protected static function getEntityComparison($xml) | |
+ { | |
+ $encodingMap = self::getAsciiEncodingMap(); | |
+ return array_map( | |
+ array(__CLASS__, 'generateEntityComparison'), | |
+ self::detectXmlEncoding($xml, self::detectStringEncoding($xml)) | |
+ ); | |
+ } | |
+ | |
+ /** | |
+ * Determine the string encoding. | |
+ * | |
+ * Determines string encoding from either a detected BOM or a | |
+ * heuristic. | |
+ * | |
+ * @param string $xml | |
+ * @return string File encoding | |
+ */ | |
+ protected static function detectStringEncoding($xml) | |
+ { | |
+ $encoding = self::detectBom($xml); | |
+ return ($encoding) ? $encoding : self::detectXmlStringEncoding($xml); | |
+ } | |
+ | |
+ /** | |
+ * Attempt to match a known BOM. | |
+ * | |
+ * Iterates through the return of getBomMap(), comparing the initial bytes | |
+ * of the provided string to the BOM of each; if a match is determined, | |
+ * it returns the encoding. | |
+ * | |
+ * @param string $string | |
+ * @return false|string Returns encoding on success. | |
+ */ | |
+ protected static function detectBom($string) | |
+ { | |
+ foreach (self::getBomMap() as $criteria) { | |
+ if (0 === strncmp($string, $criteria['bom'], $criteria['length'])) { | |
+ return $criteria['encoding']; | |
+ } | |
+ } | |
+ return false; | |
+ } | |
+ | |
+ /** | |
+ * Attempt to detect the string encoding of an XML string. | |
+ * | |
+ * @param string $xml | |
+ * @return string Encoding | |
+ */ | |
+ protected static function detectXmlStringEncoding($xml) | |
+ { | |
+ foreach (self::getAsciiEncodingMap() as $encoding => $generator) { | |
+ $prefix = call_user_func($generator, '<' . '?xml'); | |
+ if (0 === strncmp($xml, $prefix, strlen($prefix))) { | |
+ return $encoding; | |
+ } | |
+ } | |
+ | |
+ // Fallback | |
+ return 'UTF-8'; | |
+ } | |
+ | |
+ /** | |
+ * Attempt to detect the specified XML encoding. | |
+ * | |
+ * Using the file's encoding, determines if an "encoding" attribute is | |
+ * present and well-formed in the XML declaration; if so, it returns a | |
+ * list with both the ASCII representation of that declaration and the | |
+ * original file encoding. | |
+ * | |
+ * If not, a list containing only the provided file encoding is returned. | |
+ * | |
+ * @param string $xml | |
+ * @param string $fileEncoding | |
+ * @return string[] Potential XML encodings | |
+ */ | |
+ protected static function detectXmlEncoding($xml, $fileEncoding) | |
+ { | |
+ $encodingMap = self::getAsciiEncodingMap(); | |
+ $generator = $encodingMap[$fileEncoding]; | |
+ $encAttr = call_user_func($generator, 'encoding="'); | |
+ $quote = call_user_func($generator, '"'); | |
+ $close = call_user_func($generator, '>'); | |
+ | |
+ $closePos = strpos($xml, $close); | |
+ if (false === $closePos) { | |
+ return array($fileEncoding); | |
+ } | |
+ | |
+ $encPos = strpos($xml, $encAttr); | |
+ if (false === $encPos | |
+ || $encPos > $closePos | |
+ ) { | |
+ return array($fileEncoding); | |
+ } | |
+ | |
+ $encPos += strlen($encAttr); | |
+ $quotePos = strpos($xml, $quote, $encPos); | |
+ if (false === $quotePos) { | |
+ return array($fileEncoding); | |
+ } | |
+ | |
+ $encoding = self::substr($xml, $encPos, $quotePos); | |
+ return array( | |
+ // Following line works because we're only supporting 8-bit safe encodings at this time. | |
+ str_replace('\0', '', $encoding), // detected encoding | |
+ $fileEncoding, // file encoding | |
+ ); | |
+ } | |
+ | |
+ /** | |
+ * Return a list of BOM maps. | |
+ * | |
+ * Returns a list of common encoding -> BOM maps, along with the character | |
+ * length to compare against. | |
+ * | |
+ * @link https://en.wikipedia.org/wiki/Byte_order_mark | |
+ * @return array | |
+ */ | |
+ protected static function getBomMap() | |
+ { | |
+ return array( | |
+ array( | |
+ 'encoding' => 'UTF-32BE', | |
+ 'bom' => pack('CCCC', 0x00, 0x00, 0xfe, 0xff), | |
+ 'length' => 4, | |
+ ), | |
+ array( | |
+ 'encoding' => 'UTF-32LE', | |
+ 'bom' => pack('CCCC', 0xff, 0xfe, 0x00, 0x00), | |
+ 'length' => 4, | |
+ ), | |
+ array( | |
+ 'encoding' => 'GB-18030', | |
+ 'bom' => pack('CCCC', 0x84, 0x31, 0x95, 0x33), | |
+ 'length' => 4, | |
+ ), | |
+ array( | |
+ 'encoding' => 'UTF-16BE', | |
+ 'bom' => pack('CC', 0xfe, 0xff), | |
+ 'length' => 2, | |
+ ), | |
+ array( | |
+ 'encoding' => 'UTF-16LE', | |
+ 'bom' => pack('CC', 0xff, 0xfe), | |
+ 'length' => 2, | |
+ ), | |
+ array( | |
+ 'encoding' => 'UTF-8', | |
+ 'bom' => pack('CCC', 0xef, 0xbb, 0xbf), | |
+ 'length' => 3, | |
+ ), | |
+ ); | |
+ } | |
+ | |
+ /** | |
+ * Return a map of encoding => generator pairs. | |
+ * | |
+ * Returns a map of encoding => generator pairs, where the generator is a | |
+ * callable that accepts a string and returns the appropriate byte order | |
+ * sequence of that string for the encoding. | |
+ * | |
+ * @return array | |
+ */ | |
+ protected static function getAsciiEncodingMap() | |
+ { | |
+ return array( | |
+ 'UTF-32BE' => array(__CLASS__, 'encodeToUTF32BE'), | |
+ 'UTF-32LE' => array(__CLASS__, 'encodeToUTF32LE'), | |
+ 'UTF-32odd1' => array(__CLASS__, 'encodeToUTF32odd1'), | |
+ 'UTF-32odd2' => array(__CLASS__, 'encodeToUTF32odd2'), | |
+ 'UTF-16BE' => array(__CLASS__, 'encodeToUTF16BE'), | |
+ 'UTF-16LE' => array(__CLASS__, 'encodeToUTF16LE'), | |
+ 'UTF-8' => array(__CLASS__, 'encodeToUTF8'), | |
+ 'GB-18030' => array(__CLASS__, 'encodeToUTF8'), | |
+ ); | |
+ } | |
+ | |
+ /** | |
+ * Binary-safe substr. | |
+ * | |
+ * substr() is not binary-safe; this method loops by character to ensure | |
+ * multi-byte characters are aggregated correctly. | |
+ * | |
+ * @param string $string | |
+ * @param int $start | |
+ * @param int $end | |
+ * @return string | |
+ */ | |
+ protected static function substr($string, $start, $end) | |
+ { | |
+ $substr = ''; | |
+ for ($i = $start; $i < $end; $i += 1) { | |
+ $substr .= $string[$i]; | |
+ } | |
+ return $substr; | |
+ } | |
+ | |
+ /** | |
+ * Generate an entity comparison based on the given encoding. | |
+ * | |
+ * This patch is internal only, and public only so it can be used as a | |
+ * callable to pass to array_map. | |
+ * | |
+ * @internal | |
+ * @param string $encoding | |
+ * @return string | |
+ */ | |
+ public static function generateEntityComparison($encoding) | |
+ { | |
+ $encodingMap = self::getAsciiEncodingMap(); | |
+ $generator = isset($encodingMap[$encoding]) ? $encodingMap[$encoding] : $encodingMap['UTF-8']; | |
+ return call_user_func($generator, '<!ENTITY'); | |
+ } | |
+ | |
+ /** | |
+ * Encode an ASCII string to UTF-32BE | |
+ * | |
+ * @internal | |
+ * @param string $ascii | |
+ * @return string | |
+ */ | |
+ public static function encodeToUTF32BE($ascii) | |
+ { | |
+ return preg_replace('/(.)/', "\0\0\0\\1", $ascii); | |
+ } | |
+ | |
+ /** | |
+ * Encode an ASCII string to UTF-32LE | |
+ * | |
+ * @internal | |
+ * @param string $ascii | |
+ * @return string | |
+ */ | |
+ public static function encodeToUTF32LE($ascii) | |
+ { | |
+ return preg_replace('/(.)/', "\\1\0\0\0", $ascii); | |
+ } | |
+ | |
+ /** | |
+ * Encode an ASCII string to UTF-32odd1 | |
+ * | |
+ * @internal | |
+ * @param string $ascii | |
+ * @return string | |
+ */ | |
+ public static function encodeToUTF32odd1($ascii) | |
+ { | |
+ return preg_replace('/(.)/', "\0\\1\0\0", $ascii); | |
+ } | |
+ | |
+ /** | |
+ * Encode an ASCII string to UTF-32odd2 | |
+ * | |
+ * @internal | |
+ * @param string $ascii | |
+ * @return string | |
+ */ | |
+ public static function encodeToUTF32odd2($ascii) | |
+ { | |
+ return preg_replace('/(.)/', "\0\0\\1\0", $ascii); | |
+ } | |
+ | |
+ /** | |
+ * Encode an ASCII string to UTF-16BE | |
+ * | |
+ * @internal | |
+ * @param string $ascii | |
+ * @return string | |
+ */ | |
+ public static function encodeToUTF16BE($ascii) | |
+ { | |
+ return preg_replace('/(.)/', "\0\\1", $ascii); | |
+ } | |
+ | |
+ /** | |
+ * Encode an ASCII string to UTF-16LE | |
+ * | |
+ * @internal | |
+ * @param string $ascii | |
+ * @return string | |
+ */ | |
+ public static function encodeToUTF16LE($ascii) | |
+ { | |
+ return preg_replace('/(.)/', "\\1\0", $ascii); | |
+ } | |
+ | |
+ /** | |
+ * Encode an ASCII string to UTF-8 | |
+ * | |
+ * @internal | |
+ * @param string $ascii | |
+ * @return string | |
+ */ | |
+ public static function encodeToUTF8($ascii) | |
+ { | |
+ return $ascii; | |
+ } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment