#!/bin/bash # Patch apllying tool template # v0.1.2 # (c) Copyright 2013. Magento Inc. # # DO NOT CHANGE ANY LINE IN THIS FILE. # 1. Check required system tools _check_installed_tools() { local missed="" until [ -z "$1" ]; do type -t $1 >/dev/null 2>/dev/null if (( $? != 0 )); then missed="$missed $1" fi shift done echo $missed } REQUIRED_UTILS='sed patch' MISSED_REQUIRED_TOOLS=`_check_installed_tools $REQUIRED_UTILS` if (( `echo $MISSED_REQUIRED_TOOLS | wc -w` > 0 )); then echo -e "Error! Some required system tools, that are utilized in this sh script, are not installed:\nTool(s) \"$MISSED_REQUIRED_TOOLS\" is(are) missed, please install it(them)." exit 1 fi # 2. Determine bin path for system tools CAT_BIN=`which cat` PATCH_BIN=`which patch` SED_BIN=`which sed` PWD_BIN=`which pwd` BASENAME_BIN=`which basename` BASE_NAME=`$BASENAME_BIN "$0"` # 3. Help menu if [ "$1" = "-?" -o "$1" = "-h" -o "$1" = "--help" ] then $CAT_BIN << EOFH Usage: sh $BASE_NAME [--help] [-R|--revert] [--list] Apply embedded patch. -R, --revert Revert previously applied embedded patch --list Show list of applied patches --help Show this help message EOFH exit 0 fi # 4. Get "revert" flag and "list applied patches" flag REVERT_FLAG= SHOW_APPLIED_LIST=0 if [ "$1" = "-R" -o "$1" = "--revert" ] then REVERT_FLAG=-R fi if [ "$1" = "--list" ] then SHOW_APPLIED_LIST=1 fi # 5. File pathes CURRENT_DIR=`$PWD_BIN`/ APP_ETC_DIR=`echo "$CURRENT_DIR""app/etc/"` APPLIED_PATCHES_LIST_FILE=`echo "$APP_ETC_DIR""applied.patches.list"` # 6. Show applied patches list if requested if [ "$SHOW_APPLIED_LIST" -eq 1 ] ; then echo -e "Applied/reverted patches list:" if [ -e "$APPLIED_PATCHES_LIST_FILE" ] then if [ ! -r "$APPLIED_PATCHES_LIST_FILE" ] then echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be readable so applied patches list can be shown." exit 1 else $SED_BIN -n "/SUP-\|SUPEE-/p" $APPLIED_PATCHES_LIST_FILE fi else echo "" fi exit 0 fi # 7. Check applied patches track file and its directory _check_files() { if [ ! -e "$APP_ETC_DIR" ] then echo "ERROR: \"$APP_ETC_DIR\" must exist for proper tool work." exit 1 fi if [ ! -w "$APP_ETC_DIR" ] then echo "ERROR: \"$APP_ETC_DIR\" must be writeable for proper tool work." exit 1 fi if [ -e "$APPLIED_PATCHES_LIST_FILE" ] then if [ ! -w "$APPLIED_PATCHES_LIST_FILE" ] then echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be writeable for proper tool work." exit 1 fi fi } _check_files # 8. Apply/revert patch # Note: there is no need to check files permissions for files to be patched. # "patch" tool will not modify any file if there is not enough permissions for all files to be modified. # Get start points for additional information and patch data SKIP_LINES=$((`$SED_BIN -n "/^__PATCHFILE_FOLLOWS__$/=" "$CURRENT_DIR""$BASE_NAME"` + 1)) ADDITIONAL_INFO_LINE=$(($SKIP_LINES - 3))p _apply_revert_patch() { DRY_RUN_FLAG= if [ "$1" = "dry-run" ] then DRY_RUN_FLAG=" --dry-run" echo "Checking if patch can be applied/reverted successfully..." fi PATCH_APPLY_REVERT_RESULT=`$SED_BIN -e '1,/^__PATCHFILE_FOLLOWS__$/d' "$CURRENT_DIR""$BASE_NAME" | $PATCH_BIN $DRY_RUN_FLAG $REVERT_FLAG -p0` PATCH_APPLY_REVERT_STATUS=$? if [ $PATCH_APPLY_REVERT_STATUS -eq 1 ] ; then echo -e "ERROR: Patch can't be applied/reverted successfully.\n\n$PATCH_APPLY_REVERT_RESULT" exit 1 fi if [ $PATCH_APPLY_REVERT_STATUS -eq 2 ] ; then echo -e "ERROR: Patch can't be applied/reverted successfully." exit 2 fi } REVERTED_PATCH_MARK= if [ -n "$REVERT_FLAG" ] then REVERTED_PATCH_MARK=" | REVERTED" fi _apply_revert_patch dry-run _apply_revert_patch # 9. Track patch applying result echo "Patch was applied/reverted successfully." ADDITIONAL_INFO=`$SED_BIN -n ""$ADDITIONAL_INFO_LINE"" "$CURRENT_DIR""$BASE_NAME"` APPLIED_REVERTED_ON_DATE=`date -u +"%F %T UTC"` APPLIED_REVERTED_PATCH_INFO=`echo -n "$APPLIED_REVERTED_ON_DATE"" | ""$ADDITIONAL_INFO""$REVERTED_PATCH_MARK"` echo -e "$APPLIED_REVERTED_PATCH_INFO\n$PATCH_APPLY_REVERT_RESULT\n\n" >> "$APPLIED_PATCHES_LIST_FILE" exit 0 SUPEE-11155_CE_1900 | CE_1.9.0.0 | v1 | 5753587844129ff54cd45b504ce898bdd4383b25 | Mon Jul 29 22:17:27 2019 +0000 | b793097688dbf667689ab659b02a9f48ca794f64..HEAD __PATCHFILE_FOLLOWS__ diff --git app/Mage.php app/Mage.php index e1ab7888a62..aae9b2d05ab 100644 --- app/Mage.php +++ app/Mage.php @@ -813,9 +813,9 @@ final class Mage ',', (string) self::getConfig()->getNode('dev/log/allowedFileExtensions', Mage_Core_Model_Store::DEFAULT_CODE) ); - $logValidator = new Zend_Validate_File_Extension($_allowedFileExtensions); $logDir = self::getBaseDir('var') . DS . 'log'; - if (!$logValidator->isValid($logDir . DS . $file)) { + $validatedFileExtension = pathinfo($file, PATHINFO_EXTENSION); + if (!$validatedFileExtension || !in_array($validatedFileExtension, $_allowedFileExtensions)) { return; } diff --git app/code/core/Mage/Admin/Model/Block.php app/code/core/Mage/Admin/Model/Block.php index a672f4ef350..61c6134964d 100644 --- app/code/core/Mage/Admin/Model/Block.php +++ app/code/core/Mage/Admin/Model/Block.php @@ -57,7 +57,7 @@ class Mage_Admin_Model_Block extends Mage_Core_Model_Abstract if (in_array($this->getBlockName(), $disallowedBlockNames)) { $errors[] = Mage::helper('adminhtml')->__('Block Name is disallowed.'); } - if (!Zend_Validate::is($this->getBlockName(), 'Regex', array('/^[-_a-zA-Z0-9\/]*$/'))) { + if (!Zend_Validate::is($this->getBlockName(), 'Regex', array('/^[-_a-zA-Z0-9]+\/[-_a-zA-Z0-9\/]+$/'))) { $errors[] = Mage::helper('adminhtml')->__('Block Name is incorrect.'); } diff --git app/code/core/Mage/Admin/Model/User.php app/code/core/Mage/Admin/Model/User.php index 4b00d415685..05a94ad0f89 100644 --- app/code/core/Mage/Admin/Model/User.php +++ app/code/core/Mage/Admin/Model/User.php @@ -583,7 +583,7 @@ class Mage_Admin_Model_User extends Mage_Core_Model_Abstract } if ($this->userExists()) { - $errors[] = Mage::helper('adminhtml')->__('A user with the same user name or email aleady exists.'); + $errors[] = Mage::helper('adminhtml')->__('A user with the same user name or email already exists.'); } if (count($errors) === 0) { diff --git app/code/core/Mage/AdminNotification/etc/system.xml app/code/core/Mage/AdminNotification/etc/system.xml index 8ee03aad4c7..1ba0ba96050 100644 --- app/code/core/Mage/AdminNotification/etc/system.xml +++ app/code/core/Mage/AdminNotification/etc/system.xml @@ -64,6 +64,15 @@ 0 0 + + + text + adminhtml/system_config_backend_protected + 3 + 0 + 0 + 0 + diff --git app/code/core/Mage/Adminhtml/Block/Api/Role/Grid/User.php app/code/core/Mage/Adminhtml/Block/Api/Role/Grid/User.php index e36dedba096..9b0f441299d 100644 --- app/code/core/Mage/Adminhtml/Block/Api/Role/Grid/User.php +++ app/code/core/Mage/Adminhtml/Block/Api/Role/Grid/User.php @@ -157,7 +157,7 @@ class Mage_Adminhtml_Block_Api_Role_Grid_User extends Mage_Adminhtml_Block_Widge protected function _getUsers($json=false) { if ( $this->getRequest()->getParam('in_role_user') != "" ) { - return $this->getRequest()->getParam('in_role_user'); + return (int)$this->getRequest()->getParam('in_role_user'); } $roleId = ( $this->getRequest()->getParam('rid') > 0 ) ? $this->getRequest()->getParam('rid') : Mage::registry('RID'); $users = Mage::getModel('api/roles')->setId($roleId)->getRoleUsers(); diff --git app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config.php app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config.php index dec6b85ad20..19a75de2a82 100644 --- app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config.php +++ app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config.php @@ -155,6 +155,8 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config extends Mage_Ad // Hide price if needed foreach ($attributes as &$attribute) { $attribute['label'] = $this->escapeHtml($attribute['label']); + $attribute['frontend_label'] = $this->escapeHtml($attribute['frontend_label']); + $attribute['store_label'] = $this->escapeHtml($attribute['store_label']); if (isset($attribute['values']) && is_array($attribute['values'])) { foreach ($attribute['values'] as &$attributeValue) { if (!$this->getCanReadPrice()) { diff --git app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Preview.php app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Preview.php index 1077563ba24..ef16f9a325f 100644 --- app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Preview.php +++ app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Preview.php @@ -50,6 +50,12 @@ class Mage_Adminhtml_Block_Newsletter_Queue_Preview extends Mage_Adminhtml_Block $template->setTemplateText($this->getRequest()->getParam('text')); $template->setTemplateStyles($this->getRequest()->getParam('styles')); } + $template->setTemplateStyles( + $this->maliciousCodeFilter($template->getTemplateStyles()) + ); + $template->setTemplateText( + $this->maliciousCodeFilter($template->getTemplateText()) + ); $storeId = (int)$this->getRequest()->getParam('store_id'); if(!$storeId) { diff --git app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Preview.php app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Preview.php index e9ce6ccb0b0..5e69e44f40c 100644 --- app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Preview.php +++ app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Preview.php @@ -46,6 +46,12 @@ class Mage_Adminhtml_Block_Newsletter_Template_Preview extends Mage_Adminhtml_Bl $template->setTemplateText($this->getRequest()->getParam('text')); $template->setTemplateStyles($this->getRequest()->getParam('styles')); } + $template->setTemplateStyles( + $this->maliciousCodeFilter($template->getTemplateStyles()) + ); + $template->setTemplateText( + $this->maliciousCodeFilter($template->getTemplateText()) + ); $storeId = (int)$this->getRequest()->getParam('store_id'); if(!$storeId) { diff --git app/code/core/Mage/Adminhtml/Block/Permissions/Role/Grid/User.php app/code/core/Mage/Adminhtml/Block/Permissions/Role/Grid/User.php index 13796c85471..62719438a6b 100644 --- app/code/core/Mage/Adminhtml/Block/Permissions/Role/Grid/User.php +++ app/code/core/Mage/Adminhtml/Block/Permissions/Role/Grid/User.php @@ -157,7 +157,7 @@ class Mage_Adminhtml_Block_Permissions_Role_Grid_User extends Mage_Adminhtml_Blo protected function _getUsers($json=false) { if ( $this->getRequest()->getParam('in_role_user') != "" ) { - return $this->getRequest()->getParam('in_role_user'); + return (int)$this->getRequest()->getParam('in_role_user'); } $roleId = ( $this->getRequest()->getParam('rid') > 0 ) ? $this->getRequest()->getParam('rid') : Mage::registry('RID'); $users = Mage::getModel('admin/roles')->setId($roleId)->getRoleUsers(); diff --git app/code/core/Mage/Adminhtml/Block/Sales/Creditmemo/Grid.php app/code/core/Mage/Adminhtml/Block/Sales/Creditmemo/Grid.php index 4e8da85341d..821ae69cb48 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Creditmemo/Grid.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Creditmemo/Grid.php @@ -76,6 +76,7 @@ class Mage_Adminhtml_Block_Sales_Creditmemo_Grid extends Mage_Adminhtml_Block_Wi 'header' => Mage::helper('sales')->__('Order #'), 'index' => 'order_increment_id', 'type' => 'text', + 'escape' => true, )); $this->addColumn('order_created_at', array( diff --git app/code/core/Mage/Adminhtml/Block/Sales/Invoice/Grid.php app/code/core/Mage/Adminhtml/Block/Sales/Invoice/Grid.php index a14b98d4c6e..d8f964fa825 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Invoice/Grid.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Invoice/Grid.php @@ -77,6 +77,7 @@ class Mage_Adminhtml_Block_Sales_Invoice_Grid extends Mage_Adminhtml_Block_Widge 'header' => Mage::helper('sales')->__('Order #'), 'index' => 'order_increment_id', 'type' => 'text', + 'escape' => true, )); $this->addColumn('order_created_at', array( diff --git app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Header.php app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Header.php index 105314ddf68..34cdfebb7ff 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Header.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Header.php @@ -34,7 +34,10 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Header extends Mage_Adminhtml_Bloc protected function _toHtml() { if ($this->_getSession()->getOrder()->getId()) { - return '

'.Mage::helper('sales')->__('Edit Order #%s', $this->_getSession()->getOrder()->getIncrementId()).'

'; + return '

' . Mage::helper('sales')->__( + 'Edit Order #%s', + $this->escapeHtml($this->_getSession()->getOrder()->getIncrementId()) + ) . '

'; } $customerId = $this->getCustomerId(); diff --git app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create.php app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create.php index cb0a8f23d6e..89a24f937be 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create.php @@ -67,10 +67,15 @@ class Mage_Adminhtml_Block_Sales_Order_Creditmemo_Create extends Mage_Adminhtml_ public function getHeaderText() { if ($this->getCreditmemo()->getInvoice()) { - $header = Mage::helper('sales')->__('New Credit Memo for Invoice #%s', $this->getCreditmemo()->getInvoice()->getIncrementId()); - } - else { - $header = Mage::helper('sales')->__('New Credit Memo for Order #%s', $this->getCreditmemo()->getOrder()->getRealOrderId()); + $header = Mage::helper('sales')->__( + 'New Credit Memo for Invoice #%s', + $this->escapeHtml($this->getCreditmemo()->getInvoice()->getIncrementId()) + ); + } else { + $header = Mage::helper('sales')->__( + 'New Credit Memo for Order #%s', + $this->escapeHtml($this->getCreditmemo()->getOrder()->getRealOrderId()) + ); } return $header; diff --git app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php index e6857c0ab03..b587c94fc94 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php @@ -65,10 +65,11 @@ class Mage_Adminhtml_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Widget_ { $this->addColumn('real_order_id', array( - 'header'=> Mage::helper('sales')->__('Order #'), - 'width' => '80px', - 'type' => 'text', - 'index' => 'increment_id', + 'header' => Mage::helper('sales')->__('Order #'), + 'width' => '80px', + 'type' => 'text', + 'index' => 'increment_id', + 'escape' => true, )); if (!Mage::app()->isSingleStoreMode()) { diff --git app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create.php app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create.php index e955303766d..be8dbc7c7c5 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create.php @@ -64,8 +64,14 @@ class Mage_Adminhtml_Block_Sales_Order_Invoice_Create extends Mage_Adminhtml_Blo public function getHeaderText() { return ($this->getInvoice()->getOrder()->getForcedDoShipmentWithInvoice()) - ? Mage::helper('sales')->__('New Invoice and Shipment for Order #%s', $this->getInvoice()->getOrder()->getRealOrderId()) - : Mage::helper('sales')->__('New Invoice for Order #%s', $this->getInvoice()->getOrder()->getRealOrderId()); + ? Mage::helper('sales')->__( + 'New Invoice and Shipment for Order #%s', + $this->escapeHtml($this->getInvoice()->getOrder()->getRealOrderId()) + ) + : Mage::helper('sales')->__( + 'New Invoice for Order #%s', + $this->escapeHtml($this->getInvoice()->getOrder()->getRealOrderId()) + ); } /** diff --git app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/Create.php app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/Create.php index 783c9c54021..53e2692c9d9 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/Create.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/Create.php @@ -59,7 +59,10 @@ class Mage_Adminhtml_Block_Sales_Order_Shipment_Create extends Mage_Adminhtml_Bl public function getHeaderText() { - $header = Mage::helper('sales')->__('New Shipment for Order #%s', $this->getShipment()->getOrder()->getRealOrderId()); + $header = Mage::helper('sales')->__( + 'New Shipment for Order #%s', + $this->escapeHtml($this->getShipment()->getOrder()->getRealOrderId()) + ); return $header; } diff --git app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php index 243d1c2cc97..9716fd0a068 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php @@ -295,6 +295,16 @@ class Mage_Adminhtml_Block_Sales_Order_View extends Mage_Adminhtml_Block_Widget_ { return $this->getUrl('*/*/reviewPayment', array('action' => $action)); } + + /** + * Return header for view grid + * + * @return string + */ + public function getHeaderHtml() + { + return '

' . $this->escapeHtml($this->getHeaderText()) . '

'; + } // // /** // * Return URL for accept payment action diff --git app/code/core/Mage/Adminhtml/Block/Sales/Shipment/Grid.php app/code/core/Mage/Adminhtml/Block/Sales/Shipment/Grid.php index dd4ff918ad3..807184ff4d1 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Shipment/Grid.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Shipment/Grid.php @@ -88,6 +88,7 @@ class Mage_Adminhtml_Block_Sales_Shipment_Grid extends Mage_Adminhtml_Block_Widg 'header' => Mage::helper('sales')->__('Order #'), 'index' => 'order_increment_id', 'type' => 'text', + 'escape' => true, )); $this->addColumn('order_created_at', array( diff --git app/code/core/Mage/Adminhtml/Block/Sales/Transactions/Grid.php app/code/core/Mage/Adminhtml/Block/Sales/Transactions/Grid.php index 61ea9200f0c..022f38c7852 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Transactions/Grid.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Transactions/Grid.php @@ -82,7 +82,8 @@ class Mage_Adminhtml_Block_Sales_Transactions_Grid extends Mage_Adminhtml_Block_ $this->addColumn('increment_id', array( 'header' => Mage::helper('sales')->__('Order ID'), 'index' => 'increment_id', - 'type' => 'text' + 'type' => 'text', + 'escape' => true, )); $this->addColumn('txn_id', array( diff --git app/code/core/Mage/Adminhtml/Block/System/Email/Template/Preview.php app/code/core/Mage/Adminhtml/Block/System/Email/Template/Preview.php index 2b34a83f8b3..fbfbc4484fe 100644 --- app/code/core/Mage/Adminhtml/Block/System/Email/Template/Preview.php +++ app/code/core/Mage/Adminhtml/Block/System/Email/Template/Preview.php @@ -51,11 +51,12 @@ class Mage_Adminhtml_Block_System_Email_Template_Preview extends Mage_Adminhtml_ $template->setTemplateStyles($this->getRequest()->getParam('styles')); } - /* @var $filter Mage_Core_Model_Input_Filter_MaliciousCode */ - $filter = Mage::getSingleton('core/input_filter_maliciousCode'); + $template->setTemplateStyles( + $this->maliciousCodeFilter($template->getTemplateStyles()) + ); $template->setTemplateText( - $filter->filter($template->getTemplateText()) + $this->maliciousCodeFilter($template->getTemplateText()) ); Varien_Profiler::start("email_template_proccessing"); diff --git app/code/core/Mage/Adminhtml/Block/Template.php app/code/core/Mage/Adminhtml/Block/Template.php index f9074c32f44..5c7b846381b 100644 --- app/code/core/Mage/Adminhtml/Block/Template.php +++ app/code/core/Mage/Adminhtml/Block/Template.php @@ -80,4 +80,15 @@ class Mage_Adminhtml_Block_Template extends Mage_Core_Block_Template Mage::dispatchEvent('adminhtml_block_html_before', array('block' => $this)); return parent::_toHtml(); } + + /** + * Deleting script tags from string + * + * @param string $html + * @return string + */ + public function maliciousCodeFilter($html) + { + return Mage::getSingleton('core/input_filter_maliciousCode')->filter($html); + } } diff --git app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Abstract.php app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Abstract.php index fb2959b14a8..5abe362de52 100644 --- app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Abstract.php +++ app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Abstract.php @@ -114,9 +114,9 @@ abstract class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract } $out = '' - . $this->getColumn()->getHeader().''; + . $this->escapeHtml($this->getColumn()->getHeader()) . ''; } else { - $out = $this->getColumn()->getHeader(); + $out = $this->escapeHtml($this->getColumn()->getHeader()); } return $out; } diff --git app/code/core/Mage/Adminhtml/Model/LayoutUpdate/Validator.php app/code/core/Mage/Adminhtml/Model/LayoutUpdate/Validator.php index 1dcc6c47017..798e1a11b80 100644 --- app/code/core/Mage/Adminhtml/Model/LayoutUpdate/Validator.php +++ app/code/core/Mage/Adminhtml/Model/LayoutUpdate/Validator.php @@ -180,8 +180,11 @@ class Mage_Adminhtml_Model_LayoutUpdate_Validator extends Zend_Validate_Abstract protected function _getXpathBlockValidationExpression() { $xpath = ""; if (count($this->_disallowedBlock)) { - $xpath = "//block[@type='"; - $xpath .= implode("'] | //block[@type='", $this->_disallowedBlock) . "']"; + foreach ($this->_disallowedBlock as $key => $value) { + $xpath .= $key > 0 ? " | " : ''; + $xpath .= "//block[translate(@type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = "; + $xpath .= "translate('$value', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')]"; + } } return $xpath; } diff --git app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Baseurl.php app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Baseurl.php index 8f2fe83cf21..72822d796bd 100644 --- app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Baseurl.php +++ app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Baseurl.php @@ -35,6 +35,8 @@ class Mage_Adminhtml_Model_System_Config_Backend_Baseurl extends Mage_Core_Model $parsedUrl = parse_url($value); if (!isset($parsedUrl['scheme']) || !isset($parsedUrl['host'])) { Mage::throwException(Mage::helper('core')->__('The %s you entered is invalid. Please make sure that it follows "http://domain.com/" format.', $this->getFieldConfig()->label)); + } elseif (('https' != $parsedUrl['scheme']) && ('http' != $parsedUrl['scheme'])) { + Mage::throwException(Mage::helper('core')->__('Invalid URL scheme.')); } } diff --git app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Locale.php app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Locale.php index 247961df105..1fc0387a052 100644 --- app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Locale.php +++ app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Locale.php @@ -34,6 +34,27 @@ */ class Mage_Adminhtml_Model_System_Config_Backend_Locale extends Mage_Core_Model_Config_Data { + /** + * Validate data before save data + * + * @return Mage_Core_Model_Abstract + * @throws Mage_Core_Exception + */ + protected function _beforeSave() + { + $allCurrenciesOptions = Mage::getSingleton('adminhtml/system_config_source_locale_currency_all') + ->toOptionArray(true); + + $allCurrenciesValues = array_column($allCurrenciesOptions, 'value'); + + foreach ($this->getValue() as $currency) { + if (!in_array($currency, $allCurrenciesValues)) { + Mage::throwException(Mage::helper('adminhtml')->__('Currency doesn\'t exist.')); + } + } + + return parent::_beforeSave(); + } /** * Enter description here... diff --git app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Serialized/Array.php app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Serialized/Array.php index c77089c6d84..d7e60eeeedd 100644 --- app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Serialized/Array.php +++ app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Serialized/Array.php @@ -31,11 +31,19 @@ class Mage_Adminhtml_Model_System_Config_Backend_Serialized_Array extends Mage_Adminhtml_Model_System_Config_Backend_Serialized { /** - * Unset array element with '__empty' key + * Check object existence in incoming data and unset array element with '__empty' key * + * @throws Mage_Core_Exception + * @return void */ protected function _beforeSave() { + try { + Mage::helper('core/unserializeArray')->unserialize(serialize($this->getValue())); + } catch (Exception $e) { + Mage::throwException(Mage::helper('adminhtml')->__('Serialized data is incorrect')); + } + $value = $this->getValue(); if (is_array($value)) { unset($value['__empty']); diff --git app/code/core/Mage/Adminhtml/controllers/Catalog/Product/AttributeController.php app/code/core/Mage/Adminhtml/controllers/Catalog/Product/AttributeController.php index d45e3c26668..1987f9ae998 100644 --- app/code/core/Mage/Adminhtml/controllers/Catalog/Product/AttributeController.php +++ app/code/core/Mage/Adminhtml/controllers/Catalog/Product/AttributeController.php @@ -157,6 +157,7 @@ class Mage_Adminhtml_Catalog_Product_AttributeController extends Mage_Adminhtml_ /** @var $helperCatalog Mage_Catalog_Helper_Data */ $helperCatalog = Mage::helper('catalog'); //labels + $data['frontend_label'] = (array) $data['frontend_label']; foreach ($data['frontend_label'] as & $value) { if ($value) { $value = $helperCatalog->stripTags($value); diff --git app/code/core/Mage/Adminhtml/controllers/Catalog/Product/ReviewController.php app/code/core/Mage/Adminhtml/controllers/Catalog/Product/ReviewController.php index dd1d74afad7..ea2b02a5cba 100644 --- app/code/core/Mage/Adminhtml/controllers/Catalog/Product/ReviewController.php +++ app/code/core/Mage/Adminhtml/controllers/Catalog/Product/ReviewController.php @@ -41,6 +41,17 @@ class Mage_Adminhtml_Catalog_Product_ReviewController extends Mage_Adminhtml_Con */ protected $_publicActions = array('edit'); + /** + * Controller predispatch method + * + * @return Mage_Adminhtml_Controller_Action + */ + public function preDispatch() + { + $this->_setForcedFormKeyActions(array('delete', 'massDelete')); + return parent::preDispatch(); + } + public function indexAction() { $this->_title($this->__('Catalog')) diff --git app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php index 4c6814c788e..b512b229fb0 100644 --- app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php +++ app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php @@ -550,7 +550,7 @@ class Mage_Adminhtml_Catalog_ProductController extends Mage_Adminhtml_Controller catch (Mage_Eav_Model_Entity_Attribute_Exception $e) { $response->setError(true); $response->setAttribute($e->getAttributeCode()); - $response->setMessage($e->getMessage()); + $response->setMessage(Mage::helper('core')->escapeHtml($e->getMessage())); } catch (Mage_Core_Exception $e) { $response->setError(true); $response->setMessage($e->getMessage()); diff --git app/code/core/Mage/Adminhtml/controllers/Checkout/AgreementController.php app/code/core/Mage/Adminhtml/controllers/Checkout/AgreementController.php index 1d5d9238c9e..654627575ac 100644 --- app/code/core/Mage/Adminhtml/controllers/Checkout/AgreementController.php +++ app/code/core/Mage/Adminhtml/controllers/Checkout/AgreementController.php @@ -33,6 +33,17 @@ */ class Mage_Adminhtml_Checkout_AgreementController extends Mage_Adminhtml_Controller_Action { + /** + * Controller predispatch method + * + * @return Mage_Adminhtml_Controller_Action + */ + public function preDispatch() + { + $this->_setForcedFormKeyActions('delete'); + return parent::preDispatch(); + } + public function indexAction() { $this->_title($this->__('Sales'))->_title($this->__('Terms and Conditions')); diff --git app/code/core/Mage/Adminhtml/controllers/Newsletter/TemplateController.php app/code/core/Mage/Adminhtml/controllers/Newsletter/TemplateController.php index f1d085dbcf6..335ed4a96dc 100644 --- app/code/core/Mage/Adminhtml/controllers/Newsletter/TemplateController.php +++ app/code/core/Mage/Adminhtml/controllers/Newsletter/TemplateController.php @@ -167,6 +167,11 @@ class Mage_Adminhtml_Newsletter_TemplateController extends Mage_Adminhtml_Contro } try { + $allowedHtmlTags = ['text', 'styles']; + if (Mage::helper('adminhtml')->hasTags($request->getParams(), $allowedHtmlTags)) { + Mage::throwException(Mage::helper('adminhtml')->__('Invalid template data.')); + } + $template->addData($request->getParams()) ->setTemplateSubject($request->getParam('subject')) ->setTemplateCode($request->getParam('code')) diff --git app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php index fb006256292..8d53f3cc5cf 100644 --- app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php +++ app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php @@ -133,6 +133,9 @@ class Mage_Adminhtml_Promo_CatalogController extends Mage_Adminhtml_Controller_A array('request' => $this->getRequest()) ); $data = $this->getRequest()->getPost(); + if (Mage::helper('adminhtml')->hasTags($data['rule'], array('attribute'), false)) { + Mage::throwException(Mage::helper('catalogrule')->__('Wrong rule specified')); + } $data = $this->_filterDates($data, array('from_date', 'to_date')); if ($id = $this->getRequest()->getParam('rule_id')) { $model->load($id); diff --git app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php index a82dc930532..0356b11f09e 100644 --- app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php +++ app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php @@ -133,6 +133,9 @@ class Mage_Adminhtml_Promo_QuoteController extends Mage_Adminhtml_Controller_Act 'adminhtml_controller_salesrule_prepare_save', array('request' => $this->getRequest())); $data = $this->getRequest()->getPost(); + if (Mage::helper('adminhtml')->hasTags($data['rule'], array('attribute'), false)) { + Mage::throwException(Mage::helper('catalogrule')->__('Wrong rule specified')); + } $data = $this->_filterDates($data, array('from_date', 'to_date')); $id = $this->getRequest()->getParam('rule_id'); if ($id) { diff --git app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php index 5a44ec40b3d..49aa702fa4d 100644 --- app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php +++ app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php @@ -151,6 +151,13 @@ class Mage_Adminhtml_Sales_Order_CreateController extends Mage_Adminhtml_Control * Saving order data */ if ($data = $this->getRequest()->getPost('order')) { + if ( + array_key_exists('comment', $data) + && array_key_exists('reserved_order_id', $data['comment']) + ) { + unset($data['comment']['reserved_order_id']); + } + $this->_getOrderCreateModel()->importPostData($data); } @@ -477,10 +484,20 @@ class Mage_Adminhtml_Sales_Order_CreateController extends Mage_Adminhtml_Control /** * Saving quote and create order + * + * @throws Mage_Core_Exception */ public function saveAction() { try { + $orderData = $this->getRequest()->getPost('order'); + if ( + array_key_exists('reserved_order_id', $orderData['comment']) + && Mage::helper('adminhtml/sales')->hasTags($orderData['comment']['reserved_order_id']) + ) { + Mage::throwException($this->__('Invalid order data.')); + } + $this->_processActionData('save'); $paymentData = $this->getRequest()->getPost('payment'); if ($paymentData) { diff --git app/code/core/Mage/Adminhtml/controllers/SitemapController.php app/code/core/Mage/Adminhtml/controllers/SitemapController.php index 4a7bbff062e..4f2f630eb6d 100644 --- app/code/core/Mage/Adminhtml/controllers/SitemapController.php +++ app/code/core/Mage/Adminhtml/controllers/SitemapController.php @@ -33,6 +33,11 @@ */ class Mage_Adminhtml_SitemapController extends Mage_Adminhtml_Controller_Action { + /** + * Maximum sitemap name length + */ + const MAXIMUM_SITEMAP_NAME_LENGTH = 32; + /** * Controller predispatch method * @@ -141,6 +146,19 @@ class Mage_Adminhtml_SitemapController extends Mage_Adminhtml_Controller_Action if (!empty($data['sitemap_filename']) && !empty($data['sitemap_path'])) { $path = rtrim($data['sitemap_path'], '\\/') . DS . $data['sitemap_filename']; + + // check filename length + if (strlen($data['sitemap_filename']) > self::MAXIMUM_SITEMAP_NAME_LENGTH) { + Mage::getSingleton('adminhtml/session')->addError( + Mage::helper('sitemap')->__( + 'Please enter a sitemap name with at most %s characters.', + self::MAXIMUM_SITEMAP_NAME_LENGTH + )); + $this->_redirect('*/*/edit', array( + 'sitemap_id' => $this->getRequest()->getParam('sitemap_id') + )); + return; + } /** @var $validator Mage_Core_Model_File_Validator_AvailablePath */ $validator = Mage::getModel('core/file_validator_availablePath'); /** @var $helper Mage_Adminhtml_Helper_Catalog */ diff --git app/code/core/Mage/Adminhtml/controllers/System/Email/TemplateController.php app/code/core/Mage/Adminhtml/controllers/System/Email/TemplateController.php index 3e7bd5e74e9..6dca4e46dbd 100644 --- app/code/core/Mage/Adminhtml/controllers/System/Email/TemplateController.php +++ app/code/core/Mage/Adminhtml/controllers/System/Email/TemplateController.php @@ -111,6 +111,8 @@ class Mage_Adminhtml_System_Email_TemplateController extends Mage_Adminhtml_Cont /** * Save action + * + * @throws Mage_Core_Exception */ public function saveAction() { @@ -127,6 +129,11 @@ class Mage_Adminhtml_System_Email_TemplateController extends Mage_Adminhtml_Cont } try { + $allowedHtmlTags = ['template_text', 'styles']; + if (Mage::helper('adminhtml')->hasTags($request->getParams(), $allowedHtmlTags)) { + Mage::throwException(Mage::helper('adminhtml')->__('Invalid template data.')); + } + $template->setTemplateSubject($request->getParam('template_subject')) ->setTemplateCode($request->getParam('template_code')) ->setTemplateText($request->getParam('template_text')) diff --git app/code/core/Mage/Catalog/Helper/Product.php app/code/core/Mage/Catalog/Helper/Product.php old mode 100755 new mode 100644 index 8cdab44e1a1..3f380aabbbd --- app/code/core/Mage/Catalog/Helper/Product.php +++ app/code/core/Mage/Catalog/Helper/Product.php @@ -468,4 +468,41 @@ class Mage_Catalog_Helper_Product extends Mage_Core_Helper_Url { return $this->_skipSaleableCheck; } + + /** + * Get default product value by field name + * + * @param string $fieldName + * @param string $productType + * @return int + */ + public function getDefaultProductValue($fieldName, $productType) + { + $fieldData = $this->getFieldset($fieldName) ? (array) $this->getFieldset($fieldName) : null; + if ( + count($fieldData) + && array_key_exists($productType, $fieldData['product_type']) + && (bool)$fieldData['use_config'] + ) { + return $fieldData['inventory']; + } + return self::DEFAULT_QTY; + } + + /** + * Return array from config by fieldset name and area + * + * @param null|string $field + * @param string $fieldset + * @param string $area + * @return array|null + */ + public function getFieldset($field = null, $fieldset = 'catalog_product_dataflow', $area = 'admin') + { + $fieldsetData = Mage::getConfig()->getFieldset($fieldset, $area); + if ($fieldsetData) { + return $fieldsetData ? $fieldsetData->$field : $fieldsetData; + } + return $fieldsetData; + } } diff --git app/code/core/Mage/Catalog/controllers/Product/CompareController.php app/code/core/Mage/Catalog/controllers/Product/CompareController.php index 2b4bd49836e..9ae3089cef2 100644 --- app/code/core/Mage/Catalog/controllers/Product/CompareController.php +++ app/code/core/Mage/Catalog/controllers/Product/CompareController.php @@ -80,7 +80,7 @@ class Mage_Catalog_Product_CompareController extends Mage_Core_Controller_Front_ } $productId = (int) $this->getRequest()->getParam('product'); - if ($productId + if ($this->isProductAvailable($productId) && (Mage::getSingleton('log/visitor')->getId() || Mage::getSingleton('customer/session')->isLoggedIn()) ) { $product = Mage::getModel('catalog/product') @@ -106,7 +106,8 @@ class Mage_Catalog_Product_CompareController extends Mage_Core_Controller_Front_ */ public function removeAction() { - if ($productId = (int) $this->getRequest()->getParam('product')) { + $productId = (int) $this->getRequest()->getParam('product'); + if ($this->isProductAvailable($productId)) { $product = Mage::getModel('catalog/product') ->setStoreId(Mage::app()->getStore()->getId()) ->load($productId); @@ -184,4 +185,15 @@ class Mage_Catalog_Product_CompareController extends Mage_Core_Controller_Front_ $this->_customerId = $id; return $this; } + + /** + * Check if product is available + * + * @param int $productId + * @return bool + */ + public function isProductAvailable($productId) + { + return Mage::getModel('catalog/product')->load($productId)->isAvailable(); + } } diff --git app/code/core/Mage/Checkout/Model/Session.php app/code/core/Mage/Checkout/Model/Session.php index 5287b72dffc..e4d4c596415 100644 --- app/code/core/Mage/Checkout/Model/Session.php +++ app/code/core/Mage/Checkout/Model/Session.php @@ -120,13 +120,21 @@ class Mage_Checkout_Model_Session extends Mage_Core_Model_Session_Abstract if ($this->_quote === null) { /** @var $quote Mage_Sales_Model_Quote */ $quote = Mage::getModel('sales/quote')->setStoreId(Mage::app()->getStore()->getId()); + $customerSession = Mage::getSingleton('customer/session'); + if ($this->getQuoteId()) { if ($this->_loadInactive) { $quote->load($this->getQuoteId()); } else { $quote->loadActive($this->getQuoteId()); } - if ($quote->getId()) { + if ( + $quote->getId() + && ( + ($customerSession->isLoggedIn() && $customerSession->getId() == $quote->getCustomerId()) + || (!$customerSession->isLoggedIn() && !$quote->getCustomerId()) + ) + ) { /** * If current currency code of quote is not equal current currency code of store, * need recalculate totals of quote. It is possible if customer use currency switcher or @@ -143,16 +151,16 @@ class Mage_Checkout_Model_Session extends Mage_Core_Model_Session_Abstract $quote->load($this->getQuoteId()); } } else { + $quote->unsetData(); $this->setQuoteId(null); } } - $customerSession = Mage::getSingleton('customer/session'); - if (!$this->getQuoteId()) { if ($customerSession->isLoggedIn() || $this->_customer) { $customer = ($this->_customer) ? $this->_customer : $customerSession->getCustomer(); $quote->loadByCustomer($customer); + $quote->setCustomer($customer); $this->setQuoteId($quote->getId()); } else { $quote->setIsCheckoutCart(true); diff --git app/code/core/Mage/Checkout/controllers/OnepageController.php app/code/core/Mage/Checkout/controllers/OnepageController.php index 48868e67dca..ab7a3e85db4 100644 --- app/code/core/Mage/Checkout/controllers/OnepageController.php +++ app/code/core/Mage/Checkout/controllers/OnepageController.php @@ -563,7 +563,7 @@ class Mage_Checkout_OnepageController extends Mage_Checkout_Controller_Action */ public function saveOrderAction() { - if (!$this->_validateFormKey()) { + if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) { $this->_redirect('*/*'); return; } diff --git app/code/core/Mage/Cms/Helper/Data.php app/code/core/Mage/Cms/Helper/Data.php index 8dab26da71b..9d179417808 100644 --- app/code/core/Mage/Cms/Helper/Data.php +++ app/code/core/Mage/Cms/Helper/Data.php @@ -37,6 +37,7 @@ class Mage_Cms_Helper_Data extends Mage_Core_Helper_Abstract const XML_NODE_PAGE_TEMPLATE_FILTER = 'global/cms/page/tempate_filter'; const XML_NODE_BLOCK_TEMPLATE_FILTER = 'global/cms/block/tempate_filter'; const XML_NODE_ALLOWED_STREAM_WRAPPERS = 'global/cms/allowed_stream_wrappers'; + const XML_NODE_ALLOWED_MEDIA_EXT_SWF = 'adminhtml/cms/browser/extensions/media_allowed/swf'; /** * Retrieve Template processor for Page Content @@ -74,4 +75,19 @@ class Mage_Cms_Helper_Data extends Mage_Core_Helper_Abstract return is_array($allowedStreamWrappers) ? $allowedStreamWrappers : array(); } + + /** + * Check is swf file extension disabled + * + * @return bool + */ + public function isSwfDisabled() + { + $statusSwf = Mage::getConfig()->getNode(self::XML_NODE_ALLOWED_MEDIA_EXT_SWF); + if ($statusSwf instanceof Mage_Core_Model_Config_Element) { + $statusSwf = $statusSwf->asArray()[0]; + } + + return $statusSwf ? false : true; + } } diff --git app/code/core/Mage/Cms/Model/Wysiwyg/Config.php app/code/core/Mage/Cms/Model/Wysiwyg/Config.php index 4b835d429ab..0f86bc230d7 100644 --- app/code/core/Mage/Cms/Model/Wysiwyg/Config.php +++ app/code/core/Mage/Cms/Model/Wysiwyg/Config.php @@ -93,7 +93,8 @@ class Mage_Cms_Model_Wysiwyg_Config extends Varien_Object 'content_css' => Mage::getBaseUrl('js').'mage/adminhtml/wysiwyg/tiny_mce/themes/advanced/skins/default/content.css', 'width' => '100%', - 'plugins' => array() + 'plugins' => array(), + 'media_disable_flash' => Mage::helper('cms')->isSwfDisabled() )); $config->setData('directives_url_quoted', preg_quote($config->getData('directives_url'))); diff --git app/code/core/Mage/Cms/etc/config.xml app/code/core/Mage/Cms/etc/config.xml index c0595ca3c67..3d6729916ce 100644 --- app/code/core/Mage/Cms/etc/config.xml +++ app/code/core/Mage/Cms/etc/config.xml @@ -122,7 +122,7 @@ 1 - 1 + 0 1 1 1 diff --git app/code/core/Mage/Compiler/Model/Process.php app/code/core/Mage/Compiler/Model/Process.php index 24020253352..2ace6c61f0d 100644 --- app/code/core/Mage/Compiler/Model/Process.php +++ app/code/core/Mage/Compiler/Model/Process.php @@ -43,6 +43,9 @@ class Mage_Compiler_Model_Process protected $_controllerFolders = array(); + /** $_collectLibs library list array */ + protected $_collectLibs = array(); + public function __construct($options=array()) { if (isset($options['compile_dir'])) { @@ -128,6 +131,9 @@ class Mage_Compiler_Model_Process || !in_array(substr($source, strlen($source)-4, 4), array('.php'))) { return $this; } + if (!$firstIteration && stripos($source, Mage::getBaseDir('lib') . DS) !== false) { + $this->_collectLibs[] = $target; + } copy($source, $target); } return $this; @@ -341,6 +347,11 @@ class Mage_Compiler_Model_Process { $sortedClasses = array(); foreach ($classes as $className) { + /** Skip iteration if this class has already been moved to the includes folder from the lib */ + if (array_search($this->_includeDir . DS . $className . '.php', $this->_collectLibs)) { + continue; + } + $implements = array_reverse(class_implements($className)); foreach ($implements as $class) { if (!in_array($class, $sortedClasses) && !in_array($class, $this->_processedClasses) && strstr($class, '_')) { diff --git app/code/core/Mage/Core/Helper/Abstract.php app/code/core/Mage/Core/Helper/Abstract.php index fef5e1a743c..fcf6a818dda 100644 --- app/code/core/Mage/Core/Helper/Abstract.php +++ app/code/core/Mage/Core/Helper/Abstract.php @@ -422,4 +422,42 @@ abstract class Mage_Core_Helper_Abstract } return $arr; } + + /** + * Check for tags in multidimensional arrays + * + * @param string|array $data + * @param array $arrayKeys keys of the array being checked that are excluded and included in the check + * @param bool $skipTags skip transferred array keys, if false then check only them + * @return bool + */ + public function hasTags($data, array $arrayKeys = array(), $skipTags = true) + { + if (is_array($data)) { + foreach ($data as $key => $item) { + if ($skipTags && in_array($key, $arrayKeys)) { + continue; + } + if (is_array($item)) { + if ($this->hasTags($item, $arrayKeys, $skipTags)) { + return true; + } + } elseif ( + (bool)strcmp($item, $this->removeTags($item)) + || (bool)strcmp($key, $this->removeTags($key)) + ) { + if (!$skipTags && !in_array($key, $arrayKeys)) { + continue; + } + return true; + } + } + return false; + } elseif (is_string($data)) { + if ((bool)strcmp($data, $this->removeTags($data))) { + return true; + } + } + return false; + } } diff --git app/code/core/Mage/Core/Helper/Data.php app/code/core/Mage/Core/Helper/Data.php index a96121721ba..0cac2080be5 100644 --- app/code/core/Mage/Core/Helper/Data.php +++ app/code/core/Mage/Core/Helper/Data.php @@ -254,7 +254,7 @@ class Mage_Core_Helper_Data extends Mage_Core_Helper_Abstract $chars = self::CHARS_LOWERS . self::CHARS_UPPERS . self::CHARS_DIGITS; } for ($i = 0, $str = '', $lc = strlen($chars)-1; $i < $len; $i++) { - $str .= $chars[mt_rand(0, $lc)]; + $str .= $chars[random_int(0, $lc)]; } return $str; } diff --git app/code/core/Mage/Core/Model/Design/Package.php app/code/core/Mage/Core/Model/Design/Package.php index ce520dbac31..769eb1008c5 100644 --- app/code/core/Mage/Core/Model/Design/Package.php +++ app/code/core/Mage/Core/Model/Design/Package.php @@ -589,7 +589,11 @@ class Mage_Core_Model_Design_Package return false; } - $regexps = @unserialize($configValueSerialized); + try { + $regexps = Mage::helper('core/unserializeArray')->unserialize($configValueSerialized); + } catch (Exception $e) { + Mage::logException($e); + } if (empty($regexps)) { return false; diff --git app/code/core/Mage/Core/Model/Email/Template/Filter.php app/code/core/Mage/Core/Model/Email/Template/Filter.php index 74d02c64314..7f3702574da 100644 --- app/code/core/Mage/Core/Model/Email/Template/Filter.php +++ app/code/core/Mage/Core/Model/Email/Template/Filter.php @@ -520,4 +520,24 @@ class Mage_Core_Model_Email_Template_Filter extends Varien_Filter_Template } return $value; } + + /** + * Return variable value for var construction + * + * @param string $value raw parameters + * @param string $default default value + * @return string + */ + protected function _getVariable($value, $default = '{no_value_defined}') + { + Mage::register('varProcessing', true); + try { + $result = parent::_getVariable($value, $default); + } catch (Exception $e) { + $result = ''; + Mage::logException($e); + } + Mage::unregister('varProcessing'); + return $result; + } } diff --git app/code/core/Mage/Core/Model/File/Validator/AvailablePath.php app/code/core/Mage/Core/Model/File/Validator/AvailablePath.php index 4d98d642248..9c4fec7a3f3 100644 --- app/code/core/Mage/Core/Model/File/Validator/AvailablePath.php +++ app/code/core/Mage/Core/Model/File/Validator/AvailablePath.php @@ -230,8 +230,16 @@ class Mage_Core_Model_File_Validator_AvailablePath extends Zend_Validate_Abstrac } //validation + $protectedExtensions = Mage::helper('core/data')->getProtectedFileExtensions(); $value = str_replace(array('/', '\\'), DS, $this->_value); $valuePathInfo = pathinfo(ltrim($value, '\\/')); + $fileNameExtension = pathinfo($valuePathInfo['filename'], PATHINFO_EXTENSION); + + if (in_array($fileNameExtension, $protectedExtensions)) { + $this->_error(self::NOT_AVAILABLE_PATH, $this->_value); + return false; + } + if ($valuePathInfo['dirname'] == '.' || $valuePathInfo['dirname'] == DS) { $valuePathInfo['dirname'] = ''; } diff --git app/code/core/Mage/Core/Model/Observer.php app/code/core/Mage/Core/Model/Observer.php index 3e93fc92c1b..0a408529aa1 100644 --- app/code/core/Mage/Core/Model/Observer.php +++ app/code/core/Mage/Core/Model/Observer.php @@ -125,4 +125,19 @@ class Mage_Core_Model_Observer Mage::app()->cleanCache($tags); return $this; } + + /** + * Checks method availability for processing in variable + * + * @param Varien_Event_Observer $observer + * @throws Exception + * @return Mage_Core_Model_Observer + */ + public function secureVarProcessing(Varien_Event_Observer $observer) + { + if (Mage::registry('varProcessing')) { + Mage::throwException(Mage::helper('core')->__('Disallowed template variable method.')); + } + return $this; + } } diff --git app/code/core/Mage/Core/etc/config.xml app/code/core/Mage/Core/etc/config.xml index 77dbd9ad167..bb29360665e 100644 --- app/code/core/Mage/Core/etc/config.xml +++ app/code/core/Mage/Core/etc/config.xml @@ -161,6 +161,22 @@ + + + + core/observer + secureVarProcessing + + + + + + + core/observer + secureVarProcessing + + + diff --git app/code/core/Mage/Core/functions.php app/code/core/Mage/Core/functions.php index d060a0fbba4..83b0a6f0982 100644 --- app/code/core/Mage/Core/functions.php +++ app/code/core/Mage/Core/functions.php @@ -410,3 +410,19 @@ if (!function_exists('hash_equals')) { return 0 === $result; } } + +if (version_compare(PHP_VERSION, '7.0.0', '<') && !function_exists('random_int')) { + /** + * Generates pseudo-random integers + * + * @param int $min + * @param int $max + * @return int Returns random integer in the range $min to $max, inclusive. + */ + function random_int($min, $max) + { + mt_srand(); + + return mt_rand($min, $max); + } +} diff --git app/code/core/Mage/CurrencySymbol/Model/System/Currencysymbol.php app/code/core/Mage/CurrencySymbol/Model/System/Currencysymbol.php index 05b1aeea273..89109aee529 100644 --- app/code/core/Mage/CurrencySymbol/Model/System/Currencysymbol.php +++ app/code/core/Mage/CurrencySymbol/Model/System/Currencysymbol.php @@ -274,7 +274,11 @@ class Mage_CurrencySymbol_Model_System_Currencysymbol $result = array(); $configData = (string)Mage::getStoreConfig($configPath, $storeId); if ($configData) { - $result = unserialize($configData); + try { + $result = Mage::helper('core/unserializeArray')->unserialize($configData); + } catch (Exception $e) { + Mage::logException($e); + } } return is_array($result) ? $result : array(); diff --git app/code/core/Mage/Downloadable/controllers/DownloadController.php app/code/core/Mage/Downloadable/controllers/DownloadController.php index d142381beef..89c62b5b870 100644 --- app/code/core/Mage/Downloadable/controllers/DownloadController.php +++ app/code/core/Mage/Downloadable/controllers/DownloadController.php @@ -97,7 +97,12 @@ class Mage_Downloadable_DownloadController extends Mage_Core_Controller_Front_Ac { $sampleId = $this->getRequest()->getParam('sample_id', 0); $sample = Mage::getModel('downloadable/sample')->load($sampleId); - if ($sample->getId()) { + if ( + $sample->getId() + && Mage::helper('catalog/product') + ->getProduct((int) $sample->getProductId(), Mage::app()->getStore()->getId(), 'id') + ->isAvailable() + ) { $resource = ''; $resourceType = ''; if ($sample->getSampleType() == Mage_Downloadable_Helper_Download::LINK_TYPE_URL) { @@ -127,7 +132,12 @@ class Mage_Downloadable_DownloadController extends Mage_Core_Controller_Front_Ac { $linkId = $this->getRequest()->getParam('link_id', 0); $link = Mage::getModel('downloadable/link')->load($linkId); - if ($link->getId()) { + if ( + $link->getId() + && Mage::helper('catalog/product') + ->getProduct((int) $link->getProductId(), Mage::app()->getStore()->getId(), 'id') + ->isAvailable() + ) { $resource = ''; $resourceType = ''; if ($link->getSampleType() == Mage_Downloadable_Helper_Download::LINK_TYPE_URL) { diff --git app/code/core/Mage/SalesRule/Model/Coupon/Massgenerator.php app/code/core/Mage/SalesRule/Model/Coupon/Massgenerator.php index b86c5570761..c39be3685d7 100644 --- app/code/core/Mage/SalesRule/Model/Coupon/Massgenerator.php +++ app/code/core/Mage/SalesRule/Model/Coupon/Massgenerator.php @@ -79,7 +79,7 @@ class Mage_SalesRule_Model_Coupon_Massgenerator extends Mage_Core_Model_Abstract $code = ''; $charsetSize = count($charset); for ($i=0; $i<$length; $i++) { - $char = $charset[mt_rand(0, $charsetSize - 1)]; + $char = $charset[random_int(0, $charsetSize - 1)]; if ($split > 0 && ($i % $split) == 0 && $i != 0) { $char = $splitChar . $char; } diff --git app/code/core/Mage/SalesRule/Model/Resource/Report/Rule/Createdat.php app/code/core/Mage/SalesRule/Model/Resource/Report/Rule/Createdat.php index d3cf737357a..812712fb525 100644 --- app/code/core/Mage/SalesRule/Model/Resource/Report/Rule/Createdat.php +++ app/code/core/Mage/SalesRule/Model/Resource/Report/Rule/Createdat.php @@ -118,14 +118,14 @@ class Mage_SalesRule_Model_Resource_Report_Rule_Createdat extends Mage_Reports_M $adapter->getIfNullSql('base_subtotal_refunded', 0). ') * base_to_global_rate)', 0), 'discount_amount_actual' => - $adapter->getIfNullSql('SUM((base_discount_invoiced - ' . + $adapter->getIfNullSql('SUM((ABS(base_discount_invoiced) - ' . $adapter->getIfNullSql('base_discount_refunded', 0) . ') * base_to_global_rate)', 0), 'total_amount_actual' => $adapter->getIfNullSql('SUM((base_subtotal_invoiced - ' . $adapter->getIfNullSql('base_subtotal_refunded', 0) . ' - ' . - $adapter->getIfNullSql('base_discount_invoiced - ' . + $adapter->getIfNullSql('ABS(base_discount_invoiced) - ' . $adapter->getIfNullSql('base_discount_refunded', 0), 0) . ') * base_to_global_rate)', 0), ); diff --git app/code/core/Mage/Sendfriend/etc/config.xml app/code/core/Mage/Sendfriend/etc/config.xml index cccfa65b9ff..bd2ae4282b5 100644 --- app/code/core/Mage/Sendfriend/etc/config.xml +++ app/code/core/Mage/Sendfriend/etc/config.xml @@ -122,7 +122,7 @@ - 1 + 0 0 5 diff --git app/code/core/Mage/Sendfriend/etc/system.xml app/code/core/Mage/Sendfriend/etc/system.xml index bbac412ad69..3e5ec61b53f 100644 --- app/code/core/Mage/Sendfriend/etc/system.xml +++ app/code/core/Mage/Sendfriend/etc/system.xml @@ -52,6 +52,7 @@ 1 1 1 + Warning! This functionality is vulnerable and can be abused to distribute spam.]]>