#!/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_1510 | CE_1.5.1.0 | v1 | adcc33c5df92e0985dd5077f0100f17447d0385d | Mon Jul 29 22:14:19 2019 +0000 | b99651fc8f7636884650bfc2e7aff5985262453f..HEAD __PATCHFILE_FOLLOWS__ diff --git app/Mage.php app/Mage.php index 40090618535..07e6fd2f93f 100644 --- app/Mage.php +++ app/Mage.php @@ -722,9 +722,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 c581dbfdc70..f4b13c8f144 100644 --- app/code/core/Mage/Admin/Model/Block.php +++ app/code/core/Mage/Admin/Model/Block.php @@ -64,7 +64,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('admin')->__('Block Name is incorrect.'); } diff --git app/code/core/Mage/Admin/Model/User.php app/code/core/Mage/Admin/Model/User.php index b1b7c32f2af..85e4d91cd5d 100644 --- app/code/core/Mage/Admin/Model/User.php +++ app/code/core/Mage/Admin/Model/User.php @@ -438,7 +438,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 0d63ce4e509..deb8e3cfdfc 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 0cdc3aa6863..88e5c1a6c24 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 8195f51db7f..2ff9feaf3de 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 @@ -125,6 +125,23 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config extends Mage_Ad ->getConfigurableAttributesAsArray($this->_getProduct()); if(!$attributes) { return '[]'; + } else { + // 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()) { + $attributeValue['pricing_value'] = ''; + $attributeValue['is_percent'] = 0; + } + $attributeValue['can_edit_price'] = $this->getCanEditPrice(); + $attributeValue['can_read_price'] = $this->getCanReadPrice(); + } + } + } } return Mage::helper('core')->jsonEncode($attributes); } diff --git app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Preview.php app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Preview.php index 94d74baec93..eee0ac7360b 100644 --- app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Preview.php +++ app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Preview.php @@ -56,6 +56,12 @@ class Mage_Adminhtml_Block_Newsletter_Queue_Preview extends Mage_Adminhtml_Block if(!$storeId) { $storeId = Mage::app()->getDefaultStoreView()->getId(); } + $template->setTemplateStyles( + $this->maliciousCodeFilter($template->getTemplateStyles()) + ); + $template->setTemplateText( + $this->maliciousCodeFilter($template->getTemplateText()) + ); Varien_Profiler::start("newsletter_queue_proccessing"); $vars = array(); diff --git app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Preview.php app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Preview.php index f58ddf2cd92..55031b2b53e 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 e763e883c7e..7cde96f43d9 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 1ff183fbf86..e4992d1d265 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 3995f672832..b4ad0a322ec 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 dd700ff6dbd..b4a3cf8f4cb 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 5fe056d2609..2515de8c1ad 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create.php @@ -67,20 +67,17 @@ 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() + $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->getCreditmemo()->getOrder()->getRealOrderId() + } else { + $header = Mage::helper('sales')->__( + 'New Credit Memo for Order #%s', + $this->escapeHtml($this->getCreditmemo()->getOrder()->getRealOrderId()) ); } - /*$header = Mage::helper('sales')->__('New Credit Memo for Order #%s | Order Date: %s | Customer Name: %s', - $this->getCreditmemo()->getOrder()->getRealOrderId(), - $this->formatDate($this->getCreditmemo()->getOrder()->getCreatedAt(), 'medium', true), - $this->getCreditmemo()->getOrder()->getCustomerName() - );*/ + 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 bcdcea662dc..e623ef3c6c1 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 32b85a37744..2c31e263b57 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 b57e65d0dd7..8256245b6f4 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 51e10a53b02..5ee8f9da4af 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php @@ -287,6 +287,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 524eb724dc9..06aa4686d0a 100644 --- app/code/core/Mage/Adminhtml/Block/Sales/Shipment/Grid.php +++ app/code/core/Mage/Adminhtml/Block/Sales/Shipment/Grid.php @@ -75,6 +75,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 0408b200876..9a7a0a5cc2a 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 ae78b96e366..4671cea6293 100644 --- app/code/core/Mage/Adminhtml/Block/System/Email/Template/Preview.php +++ app/code/core/Mage/Adminhtml/Block/System/Email/Template/Preview.php @@ -45,10 +45,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 27a9e09af81..79852a1bd11 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 c5bfdc0c1fa..1ee7dd7ac95 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 @@ -110,11 +110,12 @@ abstract class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract extends if ($this->getColumn()->getDir()) { $className = 'sort-arrow-' . $dir; } - $out = ''.$this->getColumn()->getHeader().''; + $out = '' + . $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 9069bd55e5d..6bf14f4d96d 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 5f3bb8d1a96..6c8e9bc2e82 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 6bb22e5bcaf..63c995411d5 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 2fae4abf3ec..18259b1ccfc 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 2b2a619a647..b374b44ef4e 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 daad4757944..8e64cdc547e 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 cfca26632cc..0d9a1bc6713 100644 --- app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php +++ app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php @@ -537,7 +537,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); diff --git app/code/core/Mage/Adminhtml/controllers/Checkout/AgreementController.php app/code/core/Mage/Adminhtml/controllers/Checkout/AgreementController.php index 3b2a442ba74..5a2c8f18985 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 40abed6ba26..e6a86f92250 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 1b5acf7970d..8e366ca2da0 100644 --- app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php +++ app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php @@ -107,6 +107,9 @@ class Mage_Adminhtml_Promo_CatalogController extends Mage_Adminhtml_Controller_A $model = Mage::getModel('catalogrule/rule'); Mage::dispatchEvent('adminhtml_controller_catalogrule_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')); 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 ff756f438cd..08052a98b31 100644 --- app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php +++ app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php @@ -127,7 +127,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')); + } //filter HTML tags /** @var $helper Mage_Adminhtml_Helper_Data */ $helper = Mage::helper('adminhtml'); diff --git app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php index 18612823892..55913849872 100644 --- app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php +++ app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php @@ -135,6 +135,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); } @@ -448,10 +455,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'); if ($paymentData = $this->getRequest()->getPost('payment')) { $this->_getOrderCreateModel()->setPaymentData($paymentData); diff --git app/code/core/Mage/Adminhtml/controllers/SitemapController.php app/code/core/Mage/Adminhtml/controllers/SitemapController.php index 844d44e955a..337a734f640 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 eaae2e75c70..299bb73bdfa 100644 --- app/code/core/Mage/Adminhtml/controllers/System/Email/TemplateController.php +++ app/code/core/Mage/Adminhtml/controllers/System/Email/TemplateController.php @@ -89,6 +89,11 @@ class Mage_Adminhtml_System_Email_TemplateController extends Mage_Adminhtml_Cont $this->renderLayout(); } + /** + * Save action + * + * @throws Mage_Core_Exception + */ public function saveAction() { $request = $this->getRequest(); @@ -102,6 +107,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')) /* diff --git app/code/core/Mage/Catalog/Helper/Product.php app/code/core/Mage/Catalog/Helper/Product.php index ae4775fd9dc..e0ef630955e 100644 --- app/code/core/Mage/Catalog/Helper/Product.php +++ app/code/core/Mage/Catalog/Helper/Product.php @@ -35,6 +35,8 @@ class Mage_Catalog_Helper_Product extends Mage_Core_Helper_Url const XML_PATH_PRODUCT_URL_USE_CATEGORY = 'catalog/seo/product_use_categories'; const XML_PATH_USE_PRODUCT_CANONICAL_TAG = 'catalog/seo/product_canonical_tag'; + const DEFAULT_QTY = 1; + /** * Cache for product rewrite suffix * @@ -438,4 +440,40 @@ class Mage_Catalog_Helper_Product extends Mage_Core_Helper_Url return $product; } + /** + * 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 22c1c48c781..aa5c0299f4a 100644 --- app/code/core/Mage/Catalog/controllers/Product/CompareController.php +++ app/code/core/Mage/Catalog/controllers/Product/CompareController.php @@ -71,7 +71,11 @@ class Mage_Catalog_Product_CompareController extends Mage_Core_Controller_Front_ $this->_redirectReferer(); return; } - if ($productId = (int) $this->getRequest()->getParam('product')) { + + $productId = (int) $this->getRequest()->getParam('product'); + if ($this->isProductAvailable($productId) + && (Mage::getSingleton('log/visitor')->getId() || Mage::getSingleton('customer/session')->isLoggedIn()) + ) { $product = Mage::getModel('catalog/product') ->setStoreId(Mage::app()->getStore()->getId()) ->load($productId); @@ -95,7 +99,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); @@ -157,4 +162,15 @@ class Mage_Catalog_Product_CompareController extends Mage_Core_Controller_Front_ $this->_redirectReferer(); } + + /** + * 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 f68c5b97f5c..3a275a34056 100644 --- app/code/core/Mage/Checkout/Model/Session.php +++ app/code/core/Mage/Checkout/Model/Session.php @@ -57,11 +57,18 @@ class Mage_Checkout_Model_Session extends Mage_Core_Model_Session_Abstract if ($this->_quote === null) { $quote = Mage::getModel('sales/quote') ->setStoreId(Mage::app()->getStore()->getId()); + $customerSession = Mage::getSingleton('customer/session'); /* @var $quote Mage_Sales_Model_Quote */ if ($this->getQuoteId()) { $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 @@ -78,15 +85,15 @@ 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()) { $quote->loadByCustomer($customerSession->getCustomer()); + $quote->setCustomer($customerSession->getCustomer()); $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 abb80b00a51..66a2cd6c045 100644 --- app/code/core/Mage/Checkout/controllers/OnepageController.php +++ app/code/core/Mage/Checkout/controllers/OnepageController.php @@ -529,7 +529,7 @@ class Mage_Checkout_OnepageController extends Mage_Checkout_Controller_Action */ public function saveOrderAction() { - if (!$this->_validateFormKey()) { + if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) { return $this->_redirect('*/*'); } diff --git app/code/core/Mage/Cms/Helper/Data.php app/code/core/Mage/Cms/Helper/Data.php index c6fe4163a39..ec1011d8678 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 9bfd2bd3b51..7b7f84a900b 100644 --- app/code/core/Mage/Cms/Model/Wysiwyg/Config.php +++ app/code/core/Mage/Cms/Model/Wysiwyg/Config.php @@ -76,7 +76,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 58a3a10fd34..f8d3da7b85f 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 691cd4d7866..c699802313a 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 ce5ebd776fa..d9855585985 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 0634a35f27a..36eb5369a4d 100644 --- app/code/core/Mage/Core/Helper/Data.php +++ app/code/core/Mage/Core/Helper/Data.php @@ -233,7 +233,7 @@ class Mage_Core_Helper_Data extends Mage_Core_Helper_Abstract } mt_srand(10000000*(double)microtime()); 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 a60d4372096..42c27f2e78c 100644 --- app/code/core/Mage/Core/Model/Design/Package.php +++ app/code/core/Mage/Core/Model/Design/Package.php @@ -567,7 +567,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 04534cb4bb4..207059490dc 100644 --- app/code/core/Mage/Core/Model/Email/Template/Filter.php +++ app/code/core/Mage/Core/Model/Email/Template/Filter.php @@ -518,4 +518,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 a21b739b15b..42258b21eb2 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 a35deb5bcca..07fdad50c8a 100644 --- app/code/core/Mage/Core/Model/Observer.php +++ app/code/core/Mage/Core/Model/Observer.php @@ -94,4 +94,19 @@ class Mage_Core_Model_Observer 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 071bb066ea2..4ffc166c686 100644 --- app/code/core/Mage/Core/etc/config.xml +++ app/code/core/Mage/Core/etc/config.xml @@ -119,6 +119,24 @@ Zend_Log_Writer_Stream + + + + + core/observer + secureVarProcessing + + + + + + + core/observer + secureVarProcessing + + + + diff --git app/code/core/Mage/Core/functions.php app/code/core/Mage/Core/functions.php index 7741f695728..014c7ade7c9 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/Downloadable/controllers/DownloadController.php app/code/core/Mage/Downloadable/controllers/DownloadController.php index 8e63272d395..c07775bb47c 100644 --- app/code/core/Mage/Downloadable/controllers/DownloadController.php +++ app/code/core/Mage/Downloadable/controllers/DownloadController.php @@ -96,7 +96,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) { @@ -126,7 +131,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/Sendfriend/etc/config.xml app/code/core/Mage/Sendfriend/etc/config.xml index d205730f974..0fc0476f6b6 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 8bc6e2d43ac..4aae92827fd 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.]]>