Critical severityNVD Advisory· Published Jun 26, 2020· Updated Aug 4, 2024
CVE-2020-9580
CVE-2020-9580
Description
Magento versions 2.3.4 and earlier, 2.2.11 and earlier (see note), 1.14.4.4 and earlier, and 1.9.4.4 and earlier have a security mitigation bypass vulnerability. Successful exploitation could lead to arbitrary code execution.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
magento/community-editionPackagist | <= 2.2.11 | — |
magento/community-editionPackagist | >= 2.3.0, < 2.3.4-p2 | 2.3.4-p2 |
magento/corePackagist | < 1.9.4.5 | 1.9.4.5 |
magento/project-community-editionPackagist | <= 2.0.2 | — |
Affected products
1- Range: 2.3.4 and earlier, 2.2.11 and earlier (see note), 1.14.4.4 and earlier, and 1.9.4.4 and earlier versions
Patches
152d92dbd07f0MC-33481: Magento 2.3.4-p2 Publication
300 files changed · +2377 −1349
app/code/Magento/AdminAnalytics/composer.json+13 −13 modified@@ -6,24 +6,24 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-config": "*", - "magento/module-ui": "*", - "magento/module-release-notification": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-config": "101.1.*", + "magento/module-ui": "101.1.*", + "magento/module-release-notification": "100.3.*" }, "type": "magento2-module", "license": [ "OSL-3.0", "AFL-3.0" ], "autoload": { - "files": [ - "registration.php" - ], - "psr-4": { - "Magento\\AdminAnalytics\\": "" - } - } + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdminAnalytics\\": "" + } + }, + "version": "100.3.1-p2" } -
app/code/Magento/AdminNotification/composer.json+8 −7 modified@@ -7,12 +7,12 @@ "require": { "php": "~7.1.3||~7.2.0||~7.3.0", "lib-libxml": "*", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-media-storage": "*", - "magento/module-store": "*", - "magento/module-ui": "*", - "magento/module-config": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-media-storage": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-ui": "101.1.*", + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\AdminNotification\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/AdvancedPricingImportExport/composer.json+10 −9 modified@@ -6,14 +6,14 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-catalog-import-export": "*", - "magento/module-catalog-inventory": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-import-export": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-import-export": "101.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-import-export": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -27,5 +27,6 @@ "psr-4": { "Magento\\AdvancedPricingImportExport\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/AdvancedSearch/composer.json+10 −9 modified@@ -5,14 +5,14 @@ "sort-packages": true }, "require": { - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-catalog-search": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-search": "*", - "magento/module-store": "*", + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-search": "101.0.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-search": "101.0.*", + "magento/module-store": "101.0.*", "php": "~7.1.3||~7.2.0||~7.3.0" }, "type": "magento2-module", @@ -27,5 +27,6 @@ "psr-4": { "Magento\\AdvancedSearch\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/Amqp/composer.json+5 −4 modified@@ -5,9 +5,9 @@ "sort-packages": true }, "require": { - "magento/framework": "*", - "magento/framework-amqp": "*", - "magento/framework-message-queue": "*", + "magento/framework": "102.0.*", + "magento/framework-amqp": "100.3.*", + "magento/framework-message-queue": "100.3.*", "php": "~7.1.3||~7.2.0||~7.3.0" }, "type": "magento2-module", @@ -22,5 +22,6 @@ "psr-4": { "Magento\\Amqp\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/AmqpStore/composer.json+7 −6 modified@@ -5,14 +5,14 @@ "sort-packages": true }, "require": { - "magento/framework": "*", - "magento/framework-amqp": "*", - "magento/module-store": "*", + "magento/framework": "102.0.*", + "magento/framework-amqp": "100.3.*", + "magento/module-store": "101.0.*", "php": "~7.1.3||~7.2.0||~7.3.0" }, "suggest": { - "magento/module-asynchronous-operations": "*", - "magento/framework-message-queue": "*" + "magento/module-asynchronous-operations": "100.3.*", + "magento/framework-message-queue": "100.3.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\AmqpStore\\": "" } - } + }, + "version": "100.3.1" }
app/code/Magento/Analytics/composer.json+7 −6 modified@@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-backend": "*", - "magento/module-config": "*", - "magento/module-integration": "*", - "magento/module-store": "*", - "magento/framework": "*" + "magento/module-backend": "101.0.*", + "magento/module-config": "101.1.*", + "magento/module-integration": "100.3.*", + "magento/module-store": "101.0.*", + "magento/framework": "102.0.*" }, "type": "magento2-module", "license": [ @@ -21,5 +21,6 @@ "psr-4": { "Magento\\Analytics\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/AsynchronousOperations/composer.json+9 −8 modified@@ -5,16 +5,16 @@ "sort-packages": true }, "require": { - "magento/framework": "*", - "magento/framework-bulk": "*", - "magento/module-authorization": "*", - "magento/module-backend": "*", - "magento/module-ui": "*", + "magento/framework": "102.0.*", + "magento/framework-bulk": "100.3.*", + "magento/module-authorization": "100.3.*", + "magento/module-backend": "101.0.*", + "magento/module-ui": "101.1.*", "php": "~7.1.3||~7.2.0||~7.3.0" }, "suggest": { - "magento/module-admin-notification": "*", - "magento/module-logging": "*" + "magento/module-admin-notification": "100.3.*", + "magento/module-logging": "101.1.*" }, "type": "magento2-module", "license": [ @@ -28,5 +28,6 @@ "psr-4": { "Magento\\AsynchronousOperations\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/Authorization/composer.json+4 −3 modified@@ -6,8 +6,8 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*" }, "type": "magento2-module", "license": [ @@ -21,5 +21,6 @@ "psr-4": { "Magento\\Authorization\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/AuthorizenetAcceptjs/Block/Form.php+3 −3 modified@@ -18,8 +18,8 @@ * Block for representing the payment form * * @api - * @since 100.3.0 - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @since 100.2.1 + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class Form extends Cc @@ -57,7 +57,7 @@ public function __construct( * Check if cvv validation is available * * @return boolean - * @since 100.3.0 + * @since 100.2.1 */ public function isCvvEnabled(): bool {
app/code/Magento/AuthorizenetAcceptjs/Block/Info.php+3 −3 modified@@ -15,8 +15,8 @@ * Translates the labels for the info block * * @api - * @since 100.3.0 - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @since 100.2.1 + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class Info extends ConfigurableInfo @@ -26,7 +26,7 @@ class Info extends ConfigurableInfo * * @param string $field * @return Phrase - * @since 100.3.0 + * @since 100.2.1 */ protected function getLabel($field): Phrase {
app/code/Magento/AuthorizenetAcceptjs/Block/Payment.php+4 −4 modified@@ -18,8 +18,8 @@ * Represents the payment block for the admin checkout form * * @api - * @since 100.3.0 - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @since 100.2.1 + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class Payment extends Template @@ -55,7 +55,7 @@ public function __construct( * Retrieves the config that should be used by the block * * @return string - * @since 100.3.0 + * @since 100.2.1 */ public function getPaymentConfig(): string { @@ -70,7 +70,7 @@ public function getPaymentConfig(): string * Returns the method code for this payment method * * @return string - * @since 100.3.0 + * @since 100.2.1 */ public function getMethodCode(): string {
app/code/Magento/AuthorizenetAcceptjs/composer.json+10 −9 modified@@ -6,14 +6,14 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-payment": "*", - "magento/module-sales": "*", - "magento/module-config": "*", - "magento/module-backend": "*", - "magento/module-checkout": "*", - "magento/module-store": "*", - "magento/module-quote": "*" + "magento/framework": "102.0.*", + "magento/module-payment": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-config": "101.1.*", + "magento/module-backend": "101.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-quote": "101.1.*" }, "type": "magento2-module", "license": [ @@ -27,5 +27,6 @@ "psr-4": { "Magento\\AuthorizenetAcceptjs\\": "" } - } + }, + "version": "100.3.3" }
app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/AcceptPaymentStrategyCommand.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Chooses the best method of accepting the payment based on the status of the transaction * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class AcceptPaymentStrategyCommand implements CommandInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/CaptureStrategyCommand.php+1 −1 modified@@ -21,7 +21,7 @@ /** * Chooses the best method of capture based on the context of the payment * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class CaptureStrategyCommand implements CommandInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/FetchTransactionInfoCommand.php+1 −1 modified@@ -18,7 +18,7 @@ /** * Syncs the transaction status with authorize.net * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class FetchTransactionInfoCommand implements CommandInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/GatewayQueryCommand.php+1 −1 modified@@ -21,7 +21,7 @@ /** * Makes a request to the gateway and returns results * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class GatewayQueryCommand implements CommandInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/RefundTransactionStrategyCommand.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Chooses the best method of returning the payment based on the status of the transaction * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class RefundTransactionStrategyCommand implements CommandInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Config.php+1 −1 modified@@ -14,7 +14,7 @@ /** * Houses configuration for this gateway * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class Config extends \Magento\Payment\Gateway\Config\Config
app/code/Magento/AuthorizenetAcceptjs/Gateway/Http/Client.php+1 −1 modified@@ -22,7 +22,7 @@ /** * A client that can communicate with the Authorize.net API * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class Client implements ClientInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Http/Payload/FilterInterface.php+1 −1 modified@@ -11,7 +11,7 @@ /** * Describes a filter for filtering content after all the builders have finished * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ interface FilterInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Http/Payload/Filter/RemoveFieldsFilter.php+1 −1 modified@@ -13,7 +13,7 @@ /** * Removes a set of fields from the payload * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class RemoveFieldsFilter implements FilterInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Http/TransferFactory.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Can create a transfer object * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class TransferFactory implements TransferFactoryInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AcceptFdsDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the meta transaction information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class AcceptFdsDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AddressDataBuilder.php+1 −1 modified@@ -14,7 +14,7 @@ /** * Adds the basic payment information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class AddressDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AmountDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the amount of the transaction to the Request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class AmountDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AuthenticationDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the stored credentials to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class AuthenticationDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AuthorizeDataBuilder.php+1 −1 modified@@ -16,7 +16,7 @@ /** * Adds the meta transaction information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class AuthorizeDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/CaptureDataBuilder.php+1 −1 modified@@ -16,7 +16,7 @@ /** * Adds the meta transaction information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class CaptureDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/CustomerDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the basic payment information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class CustomerDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/CustomSettingsBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the custom settings to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class CustomSettingsBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/OrderDataBuilder.php+1 −1 modified@@ -14,7 +14,7 @@ /** * Adds the basic payment information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class OrderDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/PassthroughDataBuilder.php+1 −1 modified@@ -14,7 +14,7 @@ /** * Adds data to the request that can be used in the response * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class PassthroughDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/PaymentDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the basic payment information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class PaymentDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/PoDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the basic payment information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class PoDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/RefundPaymentDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the basic refund information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class RefundPaymentDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/RefundReferenceTransactionDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the reference transaction to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class RefundReferenceTransactionDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/RefundTransactionTypeDataBuilder.php+1 −1 modified@@ -13,7 +13,7 @@ /** * Adds the meta transaction information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class RefundTransactionTypeDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/RequestTypeBuilder.php+1 −1 modified@@ -13,7 +13,7 @@ /** * Adds the type of the request to the build subject * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class RequestTypeBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/SaleDataBuilder.php+1 −1 modified@@ -16,7 +16,7 @@ /** * Adds the meta transaction information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class SaleDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/ShippingDataBuilder.php+1 −1 modified@@ -16,7 +16,7 @@ /** * Adds the shipping information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class ShippingDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/SolutionDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the appropriate solution ID to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class SolutionDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/StoreConfigBuilder.php+1 −1 modified@@ -13,7 +13,7 @@ /** * This builder is used for correct store resolving and used only to retrieve correct store ID. * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class StoreConfigBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/StubDataBuilder.php+1 −1 modified@@ -16,7 +16,7 @@ * Since the order of params is matters for Authorize.net request, * this builder is used to reserve a place in builders sequence. * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class StubDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/TransactionDetailsDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the reference transaction to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class TransactionDetailsDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/VoidDataBuilder.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the meta transaction information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class VoidDataBuilder implements BuilderInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/CloseParentTransactionHandler.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Processes payment information from a void transaction response * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class CloseParentTransactionHandler implements HandlerInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/ClosePartialTransactionHandler.php+1 −1 modified@@ -12,7 +12,7 @@ /** * Determines that parent transaction should be close for partial refund operation. * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class ClosePartialTransactionHandler extends CloseTransactionHandler
app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/CloseTransactionHandler.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Processes payment information from a void transaction response * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class CloseTransactionHandler implements HandlerInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/PaymentResponseHandler.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Processes payment information from a response * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class PaymentResponseHandler implements HandlerInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/PaymentReviewStatusHandler.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Processes payment information from a void transaction response * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class PaymentReviewStatusHandler implements HandlerInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/TransactionDetailsResponseHandler.php+1 −1 modified@@ -17,7 +17,7 @@ /** * Adds the details to the transaction that should show when the transaction is viewed in the admin * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class TransactionDetailsResponseHandler implements HandlerInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/TransactionIdHandler.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Processes transaction id for the payment * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class TransactionIdHandler implements HandlerInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/VoidResponseHandler.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Processes payment information from a void transaction response * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class VoidResponseHandler implements HandlerInterface
app/code/Magento/AuthorizenetAcceptjs/Gateway/SubjectReader.php+1 −1 modified@@ -14,7 +14,7 @@ /** * Helper for extracting information from the payment data structure * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class SubjectReader
app/code/Magento/AuthorizenetAcceptjs/Gateway/Validator/GeneralResponseValidator.php+1 −1 modified@@ -16,7 +16,7 @@ /** * Validates that the request was successful * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class GeneralResponseValidator extends AbstractValidator
app/code/Magento/AuthorizenetAcceptjs/Gateway/Validator/TransactionHashValidator.php+1 −1 modified@@ -18,7 +18,7 @@ /** * Validates the transaction hash * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class TransactionHashValidator extends AbstractValidator
app/code/Magento/AuthorizenetAcceptjs/Gateway/Validator/TransactionResponseValidator.php+1 −1 modified@@ -16,7 +16,7 @@ /** * Validates the status of an attempted transaction * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class TransactionResponseValidator extends AbstractValidator
app/code/Magento/AuthorizenetAcceptjs/Model/Adminhtml/Source/Cctype.php+1 −1 modified@@ -13,7 +13,7 @@ /** * Authorize.net Payment CC Types Source Model * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class Cctype extends PaymentCctype
app/code/Magento/AuthorizenetAcceptjs/Model/Adminhtml/Source/Environment.php+1 −1 modified@@ -11,7 +11,7 @@ /** * Authorize.net Environment Dropdown source * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class Environment implements \Magento\Framework\Data\OptionSourceInterface
app/code/Magento/AuthorizenetAcceptjs/Model/Adminhtml/Source/PaymentAction.php+1 −1 modified@@ -11,7 +11,7 @@ /** * Authorize.net Payment Action Dropdown source * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class PaymentAction implements \Magento\Framework\Data\OptionSourceInterface
app/code/Magento/AuthorizenetAcceptjs/Model/PassthroughDataObject.php+1 −1 modified@@ -13,7 +13,7 @@ /** * Contains all the accumulated data from the request builders that should be passed through to the handlers * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class PassthroughDataObject extends DataObject
app/code/Magento/AuthorizenetAcceptjs/Model/Ui/ConfigProvider.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Retrieves config needed for checkout * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class ConfigProvider implements ConfigProviderInterface
app/code/Magento/AuthorizenetAcceptjs/Observer/DataAssignObserver.php+1 −1 modified@@ -15,7 +15,7 @@ /** * Adds the payment info to the payment object * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class DataAssignObserver extends AbstractDataAssignObserver
app/code/Magento/AuthorizenetAcceptjs/Setup/Patch/Data/CopyCurrentConfig.php+1 −1 modified@@ -19,7 +19,7 @@ /** * Copies the Authorize.net DirectPost configuration values to the new Accept.js module. * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class CopyCurrentConfig implements DataPatchInterface
app/code/Magento/AuthorizenetCardinal/composer.json+10 −9 modified@@ -6,14 +6,14 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-authorizenet-acceptjs": "*", - "magento/framework": "*", - "magento/module-cardinal-commerce": "*", - "magento/module-payment": "*", - "magento/module-sales": "*", - "magento/module-quote": "*", - "magento/module-checkout": "*", - "magento/module-store": "*" + "magento/module-authorizenet-acceptjs": "100.3.*", + "magento/framework": "102.0.*", + "magento/module-cardinal-commerce": "100.3.*", + "magento/module-payment": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-quote": "101.1.*", + "magento/module-checkout": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -27,5 +27,6 @@ "psr-4": { "Magento\\AuthorizenetCardinal\\": "" } - } + }, + "version": "100.3.1" }
app/code/Magento/AuthorizenetCardinal/Gateway/Request/Authorize3DSecureBuilder.php+1 −1 modified@@ -17,7 +17,7 @@ /** * Adds the cardholder authentication information to the request * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class Authorize3DSecureBuilder implements BuilderInterface
app/code/Magento/AuthorizenetCardinal/Gateway/Validator/CavvResponseValidator.php+1 −1 modified@@ -17,7 +17,7 @@ /** * Validates cardholder authentication verification response code. * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class CavvResponseValidator extends AbstractValidator
app/code/Magento/AuthorizenetCardinal/Model/Checkout/ConfigProvider.php+1 −1 modified@@ -13,7 +13,7 @@ /** * Configuration provider. * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class ConfigProvider implements ConfigProviderInterface
app/code/Magento/AuthorizenetCardinal/Model/Config.php+1 −1 modified@@ -15,7 +15,7 @@ * * Class is a proxy service for retrieving configuration settings. * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class Config
app/code/Magento/AuthorizenetCardinal/Observer/DataAssignObserver.php+1 −1 modified@@ -16,7 +16,7 @@ /** * Adds the payment info to the payment object * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class DataAssignObserver extends AbstractDataAssignObserver
app/code/Magento/Authorizenet/composer.json+11 −10 modified@@ -6,17 +6,17 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-checkout": "*", - "magento/module-payment": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-payment": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-config": "*" + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -30,5 +30,6 @@ "psr-4": { "Magento\\Authorizenet\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/AuthorizenetGraphQl/composer.json+5 −4 modified@@ -4,11 +4,11 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-quote-graph-ql": "*" + "magento/framework": "102.0.*", + "magento/module-quote-graph-ql": "100.3.*" }, "suggest": { - "magento/module-graph-ql": "*" + "magento/module-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -21,5 +21,6 @@ "psr-4": { "Magento\\AuthorizenetGraphQl\\": "" } - } + }, + "version": "100.3.1" }
app/code/Magento/AuthorizenetGraphQl/Model/AuthorizenetDataProvider.php+1 −1 modified@@ -14,7 +14,7 @@ /** * SetPaymentMethod additional data provider model for Authorizenet payment method * - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of * official payment integration available on the marketplace */ class AuthorizenetDataProvider implements AdditionalDataProviderInterface
app/code/Magento/Backend/composer.json+21 −20 modified@@ -5,27 +5,27 @@ "sort-packages": true }, "require": { - "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backup": "*", - "magento/module-catalog": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-developer": "*", - "magento/module-directory": "*", - "magento/module-eav": "*", - "magento/module-quote": "*", - "magento/module-reports": "*", - "magento/module-require-js": "*", - "magento/module-sales": "*", - "magento/module-security": "*", - "magento/module-store": "*", - "magento/module-translation": "*", - "magento/module-ui": "*", - "magento/module-user": "*" + "php": "~7.1.3||~7.2.0||~7.3.0", + "magento/framework": "102.0.*", + "magento/module-backup": "100.3.*", + "magento/module-catalog": "103.0.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-developer": "100.3.*", + "magento/module-directory": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-quote": "101.1.*", + "magento/module-reports": "100.3.*", + "magento/module-require-js": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-security": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-translation": "100.3.*", + "magento/module-ui": "101.1.*", + "magento/module-user": "101.1.*" }, "suggest": { - "magento/module-theme": "*" + "magento/module-theme": "101.0.*" }, "type": "magento2-module", "license": [ @@ -39,5 +39,6 @@ "psr-4": { "Magento\\Backend\\": "" } - } + }, + "version": "101.0.4-p2" }
app/code/Magento/Backend/Test/Mftf/ActionGroup/AdminSetStoreInformationConfigurationActionGroup.xml+36 −0 added@@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminSetStoreInformationConfigurationActionGroup"> + <annotations> + <description>Set Store Information configurations</description> + </annotations> + <arguments> + <argument name="storeName" type="string" defaultValue="{{AdminGeneralSetStoreNameConfigData.value}}"/> + <argument name="storeHoursOfOperation" type="string" defaultValue="{{AdminGeneralSetStoreHoursConfigData.value}}"/> + <argument name="vatNumber" type="string" defaultValue="{{AdminGeneralSetVatNumberConfigData.value}}"/> + <argument name="telephone" type="string" defaultValue="{{US_Address_TX.telephone}}"/> + <argument name="country" type="string" defaultValue="{{US_Address_TX.country_id}}"/> + <argument name="state" type="string" defaultValue="{{US_Address_TX.state}}"/> + <argument name="city" type="string" defaultValue="{{US_Address_TX.city}}"/> + <argument name="postcode" type="string" defaultValue="{{US_Address_TX.postcode}}"/> + <argument name="street" type="string" defaultValue="{{US_Address_TX.street[0]}}"/> + </arguments> + <magentoCLI command="config:set {{AdminGeneralSetStoreNameConfigData.path}} '{{storeName}}'" stepKey="setStoreInformationName"/> + <magentoCLI command="config:set {{AdminGeneralSetStorePhoneConfigData.path}} '{{telephone}}'" stepKey="setStoreInformationPhone"/> + <magentoCLI command="config:set {{AdminGeneralSetStoreHoursConfigData.path}} '{{storeHoursOfOperation}}'" stepKey="setStoreHoursInformation"/> + <magentoCLI command="config:set {{AdminGeneralSetCountryConfigData.path}} '{{country}}'" stepKey="setStoreInformationCountry"/> + <magentoCLI command="config:set {{AdminGeneralSetStateConfigData.path}} '{{state}}'" stepKey="setStoreInformationState"/> + <magentoCLI command="config:set {{AdminGeneralSetCityConfigData.path}} '{{city}}'" stepKey="setStoreInformationCity"/> + <magentoCLI command="config:set {{AdminGeneralSetPostcodeConfigData.path}} '{{postcode}}'" stepKey="setStoreInformationPostcode"/> + <magentoCLI command="config:set {{AdminGeneralSetStreetAddressConfigData.path}} '{{street}}'" stepKey="setStoreInformationStreetAddress"/> + <magentoCLI command="config:set {{AdminGeneralSetVatNumberConfigData.path}} '{{vatNumber}}'" stepKey="setStoreInformationVatNumber"/> + </actionGroup> +</actionGroups>
app/code/Magento/Backend/Test/Mftf/Data/AdminGeneralStoreInfomationConfigData.xml+7 −0 modified@@ -30,4 +30,11 @@ <entity name="AdminGeneralSetStreetAddress2ConfigData"> <data key="path">general/store_information/street_line2</data> </entity> + <entity name="AdminGeneralSetStateConfigData"> + <data key="path">general/store_information/region_id</data> + </entity> + <entity name="AdminGeneralSetStoreHoursConfigData"> + <data key="path">general/store_information/hours</data> + <data key="value">8AM-8PM</data> + </entity> </entities>
app/code/Magento/Backup/composer.json+6 −5 modified@@ -6,10 +6,10 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-cron": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-cron": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -23,5 +23,6 @@ "psr-4": { "Magento\\Backup\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Braintree/composer.json+19 −18 modified@@ -7,26 +7,26 @@ "require": { "php": "~7.1.3||~7.2.0||~7.3.0", "braintree/braintree_php": "3.35.0", - "magento/framework": "*", + "magento/framework": "102.0.*", "magento/magento-composer-installer": "*", - "magento/module-catalog": "*", - "magento/module-backend": "*", - "magento/module-checkout": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-directory": "*", - "magento/module-instant-purchase": "*", - "magento/module-payment": "*", - "magento/module-paypal": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-ui": "*", - "magento/module-vault": "*", - "magento/module-multishipping": "*", - "magento/module-theme": "*" + "magento/module-catalog": "103.0.*", + "magento/module-backend": "101.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-instant-purchase": "100.3.*", + "magento/module-payment": "100.3.*", + "magento/module-paypal": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-ui": "101.1.*", + "magento/module-vault": "101.1.*", + "magento/module-multishipping": "100.3.*", + "magento/module-theme": "101.0.*" }, "suggest": { - "magento/module-checkout-agreements": "*" + "magento/module-checkout-agreements": "100.3.*" }, "type": "magento2-module", "license": [ @@ -40,5 +40,6 @@ "psr-4": { "Magento\\Braintree\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/BraintreeGraphQl/composer.json+8 −7 modified@@ -4,14 +4,14 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-braintree": "*", - "magento/module-store": "*", - "magento/module-quote": "*", - "magento/module-quote-graph-ql": "*" + "magento/framework": "102.0.*", + "magento/module-braintree": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-quote": "101.1.*", + "magento/module-quote-graph-ql": "100.3.*" }, "suggest": { - "magento/module-graph-ql": "*" + "magento/module-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -24,5 +24,6 @@ "psr-4": { "Magento\\BraintreeGraphQl\\": "" } - } + }, + "version": "100.3.1" }
app/code/Magento/Bundle/composer.json+21 −20 modified@@ -6,27 +6,27 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-catalog-rule": "*", - "magento/module-checkout": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-gift-message": "*", - "magento/module-media-storage": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-store": "*", - "magento/module-tax": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-catalog-rule": "101.1.*", + "magento/module-checkout": "100.3.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-gift-message": "100.3.*", + "magento/module-media-storage": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*", + "magento/module-ui": "101.1.*" }, "suggest": { - "magento/module-webapi": "*", - "magento/module-bundle-sample-data": "*", - "magento/module-sales-rule": "*" + "magento/module-webapi": "100.3.*", + "magento/module-bundle-sample-data": "Sample Data version: 100.3.*", + "magento/module-sales-rule": "101.1.*" }, "type": "magento2-module", "license": [ @@ -40,5 +40,6 @@ "psr-4": { "Magento\\Bundle\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/BundleGraphQl/composer.json+9 −8 modified@@ -4,13 +4,13 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-catalog": "*", - "magento/module-bundle": "*", - "magento/module-catalog-graph-ql": "*", - "magento/module-quote": "*", - "magento/module-quote-graph-ql": "*", - "magento/module-store": "*", - "magento/framework": "*" + "magento/module-catalog": "103.0.*", + "magento/module-bundle": "100.3.*", + "magento/module-catalog-graph-ql": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-quote-graph-ql": "100.3.*", + "magento/module-store": "101.0.*", + "magento/framework": "102.0.*" }, "license": [ "OSL-3.0", @@ -23,5 +23,6 @@ "psr-4": { "Magento\\BundleGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/BundleImportExport/composer.json+9 −8 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-bundle": "*", - "magento/module-store": "*", - "magento/module-catalog": "*", - "magento/module-catalog-import-export": "*", - "magento/module-eav": "*", - "magento/module-import-export": "*" + "magento/framework": "102.0.*", + "magento/module-bundle": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-import-export": "101.0.*", + "magento/module-eav": "102.0.*", + "magento/module-import-export": "100.3.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\BundleImportExport\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/CacheInvalidate/composer.json+4 −3 modified@@ -6,8 +6,8 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-page-cache": "*" + "magento/framework": "102.0.*", + "magento/module-page-cache": "100.3.*" }, "type": "magento2-module", "license": [ @@ -21,5 +21,6 @@ "psr-4": { "Magento\\CacheInvalidate\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Captcha/composer.json+7 −6 modified@@ -6,11 +6,11 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-checkout": "*", - "magento/module-customer": "*", - "magento/module-store": "*", + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-store": "101.0.*", "zendframework/zend-captcha": "^2.7.1", "zendframework/zend-db": "^2.8.2", "zendframework/zend-session": "^2.7.3" @@ -27,5 +27,6 @@ "psr-4": { "Magento\\Captcha\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/CardinalCommerce/composer.json+6 −5 modified@@ -6,10 +6,10 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-checkout": "*", - "magento/module-payment": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-payment": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -23,5 +23,6 @@ "psr-4": { "Magento\\CardinalCommerce\\": "" } - } + }, + "version": "100.3.1-p2" }
app/code/Magento/CardinalCommerce/Model/JwtManagement.php+3 −1 modified@@ -8,6 +8,7 @@ namespace Magento\CardinalCommerce\Model; use Magento\Framework\Serialize\Serializer\Json; +use Magento\Framework\Encryption\Helper\Security; /** * JSON Web Token management. @@ -62,7 +63,8 @@ public function decode(string $jwt, string $key): array $payload = $this->json->unserialize($payloadJson); $signature = $this->urlSafeB64Decode($signatureB64); - if ($signature !== $this->sign($headB64 . '.' . $payloadB64, $key, $header['alg'])) { + + if (!Security::compareStrings($signature, $this->sign($headB64 . '.' . $payloadB64, $key, $header['alg']))) { throw new \InvalidArgumentException('JWT signature verification failed'); }
app/code/Magento/CatalogAnalytics/composer.json+5 −4 modified@@ -3,9 +3,9 @@ "description": "N/A", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-analytics": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-analytics": "100.3.*" }, "type": "magento2-module", "license": [ @@ -19,5 +19,6 @@ "psr-4": { "Magento\\CatalogAnalytics\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Catalog/Api/SpecialPriceInterface.php+1 −0 modified@@ -31,6 +31,7 @@ interface SpecialPriceInterface * ] * @since 101.1.0 * @since 102.0.0 + * @since 102.0.0 */ public function get(array $skus);
app/code/Magento/CatalogCmsGraphQl/composer.json+8 −7 modified@@ -4,14 +4,14 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-cms-graph-ql": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-cms-graph-ql": "100.3.*" }, "suggest": { - "magento/module-graph-ql": "*", - "magento/module-cms": "*", - "magento/module-catalog-graph-ql": "*" + "magento/module-graph-ql": "100.3.*", + "magento/module-cms": "103.0.*", + "magento/module-catalog-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -24,5 +24,6 @@ "psr-4": { "Magento\\CatalogCmsGraphQl\\": "" } - } + }, + "version": "100.3.0" }
app/code/Magento/Catalog/composer.json+31 −30 modified@@ -6,37 +6,37 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-authorization": "*", - "magento/module-asynchronous-operations": "*", - "magento/module-backend": "*", - "magento/module-catalog-inventory": "*", - "magento/module-catalog-rule": "*", - "magento/module-catalog-url-rewrite": "*", - "magento/module-checkout": "*", - "magento/module-cms": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-directory": "*", - "magento/module-eav": "*", - "magento/module-indexer": "*", - "magento/module-media-storage": "*", - "magento/module-msrp": "*", - "magento/module-page-cache": "*", - "magento/module-product-alert": "*", - "magento/module-quote": "*", - "magento/module-store": "*", - "magento/module-tax": "*", - "magento/module-theme": "*", - "magento/module-ui": "*", - "magento/module-url-rewrite": "*", - "magento/module-widget": "*", - "magento/module-wishlist": "*" + "magento/framework": "102.0.*", + "magento/module-authorization": "100.3.*", + "magento/module-asynchronous-operations": "100.3.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-catalog-rule": "101.1.*", + "magento/module-catalog-url-rewrite": "100.3.*", + "magento/module-checkout": "100.3.*", + "magento/module-cms": "103.0.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-indexer": "100.3.*", + "magento/module-media-storage": "100.3.*", + "magento/module-msrp": "100.3.*", + "magento/module-page-cache": "100.3.*", + "magento/module-product-alert": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*", + "magento/module-theme": "101.0.*", + "magento/module-ui": "101.1.*", + "magento/module-url-rewrite": "101.1.*", + "magento/module-widget": "101.1.*", + "magento/module-wishlist": "101.1.*" }, "suggest": { - "magento/module-cookie": "*", - "magento/module-sales": "*", - "magento/module-catalog-sample-data": "*" + "magento/module-cookie": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-catalog-sample-data": "Sample Data version: 100.3.*" }, "type": "magento2-module", "license": [ @@ -50,5 +50,6 @@ "psr-4": { "Magento\\Catalog\\": "" } - } + }, + "version": "103.0.4-p2" }
app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php+37 −5 modified@@ -7,14 +7,16 @@ namespace Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute; use Magento\AsynchronousOperations\Api\Data\OperationInterface; +use Magento\Catalog\Model\ProductFactory; use Magento\Eav\Model\Config; use Magento\Framework\App\Action\HttpPostActionInterface; use Magento\Backend\App\Action; use Magento\Framework\App\ObjectManager; +use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Stdlib\DateTime\TimezoneInterface; /** - * Class Save + * Class responsible for saving product attributes. * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute implements HttpPostActionInterface @@ -59,6 +61,11 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribut */ private $eavConfig; + /** + * @var ProductFactory + */ + private $productFactory; + /** * @param Action\Context $context * @param \Magento\Catalog\Helper\Product\Edit\Action\Attribute $attributeHelper @@ -70,6 +77,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribut * @param int $bulkSize * @param TimezoneInterface $timezone * @param Config $eavConfig + * @param ProductFactory $productFactory * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -82,7 +90,8 @@ public function __construct( \Magento\Authorization\Model\UserContextInterface $userContext, int $bulkSize = 100, TimezoneInterface $timezone = null, - Config $eavConfig = null + Config $eavConfig = null, + ProductFactory $productFactory = null ) { parent::__construct($context, $attributeHelper); $this->bulkManagement = $bulkManagement; @@ -95,6 +104,7 @@ public function __construct( ->get(TimezoneInterface::class); $this->eavConfig = $eavConfig ?: ObjectManager::getInstance() ->get(Config::class); + $this->productFactory = $productFactory ?? ObjectManager::getInstance()->get(ProductFactory::class); } /** @@ -120,9 +130,10 @@ public function execute() $attributesData = $this->sanitizeProductAttributes($attributesData); try { + $this->validateProductAttributes($attributesData); $this->publish($attributesData, $websiteRemoveData, $websiteAddData, $storeId, $websiteId, $productIds); $this->messageManager->addSuccessMessage(__('Message is added to queue')); - } catch (\Magento\Framework\Exception\LocalizedException $e) { + } catch (LocalizedException $e) { $this->messageManager->addErrorMessage($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addExceptionMessage( @@ -147,10 +158,12 @@ private function sanitizeProductAttributes($attributesData) foreach ($attributesData as $attributeCode => $value) { $attribute = $this->eavConfig->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $attributeCode); + if (!$attribute->getAttributeId()) { unset($attributesData[$attributeCode]); continue; } + if ($attribute->getBackendType() === 'datetime') { if (!empty($value)) { $filterInput = new \Zend_Filter_LocalizedToNormalized(['date_format' => $dateFormat]); @@ -178,6 +191,25 @@ private function sanitizeProductAttributes($attributesData) return $attributesData; } + /** + * Validate product attributes data. + * + * @param array $attributesData + * + * @return void + * @throws LocalizedException + */ + private function validateProductAttributes(array $attributesData): void + { + $product = $this->productFactory->create(); + $product->setData($attributesData); + + foreach (array_keys($attributesData) as $attributeCode) { + $attribute = $this->eavConfig->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $attributeCode); + $attribute->getBackend()->validate($product); + } + } + /** * Schedule new bulk * @@ -187,7 +219,7 @@ private function sanitizeProductAttributes($attributesData) * @param int $storeId * @param int $websiteId * @param array $productIds - * @throws \Magento\Framework\Exception\LocalizedException + * @throws LocalizedException * * @return void */ @@ -241,7 +273,7 @@ private function publish( $this->userContext->getUserId() ); if (!$result) { - throw new \Magento\Framework\Exception\LocalizedException( + throw new LocalizedException( __('Something went wrong while processing the request.') ); }
app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php+7 −3 modified@@ -143,8 +143,10 @@ public function execute() $optionData = $this->formDataSerializer ->unserialize($this->getRequest()->getParam('serialized_options', '[]')); } catch (\InvalidArgumentException $e) { - $message = __("The attribute couldn't be saved due to an error. Verify your information and try again. " - . "If the error persists, please try again later."); + $message = __( + "The attribute couldn't be saved due to an error. Verify your information and try again. " + . "If the error persists, please try again later." + ); $this->messageManager->addErrorMessage($message); return $this->returnResult('catalog/*/edit', ['_current' => true], ['error' => true]); } @@ -221,7 +223,7 @@ public function execute() return $this->returnResult('catalog/*/', [], ['error' => true]); } // entity type check - if ($model->getEntityTypeId() != $this->_entityTypeId) { + if ($model->getEntityTypeId() != $this->_entityTypeId || array_key_exists('backend_model', $data)) { $this->messageManager->addErrorMessage(__('We can\'t update the attribute.')); $this->_session->setAttributeData($data); return $this->returnResult('catalog/*/', [], ['error' => true]); @@ -258,6 +260,8 @@ public function execute() unset($data['apply_to']); } + unset($data['entity_type_id']); + $model->addData($data); if (!$attributeId) {
app/code/Magento/CatalogCustomerGraphQl/composer.json+7 −6 modified@@ -4,11 +4,11 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-customer": "*", - "magento/module-catalog-graph-ql": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-customer": "102.0.*", + "magento/module-catalog-graph-ql": "100.3.*", + "magento/module-store": "101.0.*" }, "license": [ "OSL-3.0", @@ -21,5 +21,6 @@ "psr-4": { "Magento\\CatalogCustomerGraphQl\\": "" } - } + }, + "version": "100.3.0" }
app/code/Magento/CatalogGraphQl/composer.json+13 −12 modified@@ -4,19 +4,19 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-eav": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-search": "*", - "magento/module-store": "*", - "magento/module-eav-graph-ql": "*", - "magento/module-catalog-search": "*", - "magento/framework": "*" + "magento/module-eav": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-search": "101.0.*", + "magento/module-store": "101.0.*", + "magento/module-eav-graph-ql": "100.3.*", + "magento/module-catalog-search": "101.0.*", + "magento/framework": "102.0.*" }, "suggest": { - "magento/module-graph-ql": "*", - "magento/module-graph-ql-cache": "*", - "magento/module-store-graph-ql": "*" + "magento/module-graph-ql": "100.3.*", + "magento/module-graph-ql-cache": "100.3.*", + "magento/module-store-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -29,5 +29,6 @@ "psr-4": { "Magento\\CatalogGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/CatalogGraphQl/Model/Resolver/Category/Products.php+2 −2 modified@@ -30,13 +30,13 @@ class Products implements ResolverInterface /** * @var Builder - * @deprecated + * @deprecated 100.3.4 */ private $searchCriteriaBuilder; /** * @var Filter - * @deprecated + * @deprecated 100.3.4 */ private $filterQuery;
app/code/Magento/CatalogGraphQl/Model/Resolver/Products.php+3 −3 modified@@ -25,7 +25,7 @@ class Products implements ResolverInterface { /** * @var Builder - * @deprecated + * @deprecated 100.3.4 */ private $searchCriteriaBuilder; @@ -36,13 +36,13 @@ class Products implements ResolverInterface /** * @var Filter - * @deprecated + * @deprecated 100.3.4 */ private $filterQuery; /** * @var SearchFilter - * @deprecated + * @deprecated 100.3.4 */ private $searchFilter;
app/code/Magento/CatalogImportExport/composer.json+13 −12 modified@@ -7,17 +7,17 @@ "require": { "php": "~7.1.3||~7.2.0||~7.3.0", "ext-ctype": "*", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-catalog-url-rewrite": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-import-export": "*", - "magento/module-media-storage": "*", - "magento/module-store": "*", - "magento/module-tax": "*", - "magento/module-authorization": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-catalog-url-rewrite": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-import-export": "100.3.*", + "magento/module-media-storage": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*", + "magento/module-authorization": "100.3.*" }, "type": "magento2-module", "license": [ @@ -31,5 +31,6 @@ "psr-4": { "Magento\\CatalogImportExport\\": "" } - } + }, + "version": "101.0.4-p2" }
app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportBundleProductTest.xml+3 −0 modified@@ -107,6 +107,9 @@ </actionGroup> <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Go to export page -->
app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportImportConfigurableProductWithImagesTest.xml+3 −0 modified@@ -153,6 +153,9 @@ <actionGroup ref="resetProductGridToDefaultView" stepKey="resetProductGridColumnsInitial"/> <!-- Admin logout--> <actionGroup ref="logout" stepKey="adminLogout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Go to System > Export -->
app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleAndConfigurableProductsWithCustomOptionsTest.xml+3 −0 modified@@ -95,6 +95,9 @@ </actionGroup> <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Go to export page -->
app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductAndConfigurableProductsWithAssignedImagesTest.xml+3 −0 modified@@ -111,6 +111,9 @@ </actionGroup> <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Go to export page -->
app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductAssignedToMainWebsiteAndConfigurableProductAssignedToCustomWebsiteTest.xml+3 −0 modified@@ -96,6 +96,9 @@ </actionGroup> <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Go to export page -->
app/code/Magento/CatalogInventory/composer.json+10 −9 modified@@ -6,14 +6,14 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-quote": "*", - "magento/module-store": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-quote": "101.1.*", + "magento/module-store": "101.0.*", + "magento/module-ui": "101.1.*" }, "type": "magento2-module", "license": [ @@ -28,5 +28,6 @@ "Magento\\CatalogInventory\\": "" } }, - "abandoned": "magento/inventory-composer-metapackage" + "abandoned": "magento/inventory-composer-metapackage", + "version": "100.3.4-p2" }
app/code/Magento/CatalogInventoryGraphQl/composer.json+22 −21 modified@@ -1,24 +1,25 @@ { - "name": "magento/module-catalog-inventory-graph-ql", - "description": "N/A", - "type": "magento2-module", - "require": { - "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-store": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*" - }, - "license": [ - "OSL-3.0", - "AFL-3.0" - ], - "autoload": { - "files": [ - "registration.php" + "name": "magento/module-catalog-inventory-graph-ql", + "description": "N/A", + "type": "magento2-module", + "require": { + "php": "~7.1.3||~7.2.0||~7.3.0", + "magento/framework": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*" + }, + "license": [ + "OSL-3.0", + "AFL-3.0" ], - "psr-4": { - "Magento\\CatalogInventoryGraphQl\\": "" - } - } + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogInventoryGraphQl\\": "" + } + }, + "version": "100.3.4" }
app/code/Magento/CatalogInventory/Test/Mftf/Test/AssociatedProductToConfigurableOutOfStockTest.xml+10 −7 modified@@ -80,13 +80,16 @@ </before> <after> - <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> - <deleteData createDataKey="simplecategory" stepKey="deleteSimpleCategory"/> - <deleteData createDataKey="createSimpleUsCustomer" stepKey="deleteCustomer"/> - <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/> - <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> - <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> - </after> + <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> + <deleteData createDataKey="simplecategory" stepKey="deleteSimpleCategory"/> + <deleteData createDataKey="createSimpleUsCustomer" stepKey="deleteCustomer"/> + <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/> + <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> + <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> + </after> <!-- Login as a customer --> <actionGroup ref="LoginToStorefrontActionGroup" stepKey="signUpNewUser">
app/code/Magento/Catalog/Model/Attribute/Backend/Customlayoutupdate.php+2 −1 modified@@ -22,7 +22,7 @@ class Customlayoutupdate extends AbstractBackend { /** * @var ValidatorFactory - * @deprecated Is not used anymore. + * @deprecated 103.0.4 Is not used anymore. */ protected $_layoutUpdateValidatorFactory; @@ -117,6 +117,7 @@ private function putValue(AbstractModel $object, ?string $value): void * * @param AbstractModel $object * @throws LocalizedException + * @since 103.0.4 */ public function beforeSave($object) {
app/code/Magento/Catalog/Model/ProductLink/Repository.php+4 −4 modified@@ -54,14 +54,14 @@ class Repository implements \Magento\Catalog\Api\ProductLinkRepositoryInterface /** * @var CollectionProvider - * @deprecated Not used anymore. + * @deprecated 103.0.4 Not used anymore. * @see query */ protected $entityCollectionProvider; /** * @var LinksInitializer - * @deprecated Not used. + * @deprecated 103.0.4 Not used. */ protected $linkInitializer; @@ -77,14 +77,14 @@ class Repository implements \Magento\Catalog\Api\ProductLinkRepositoryInterface /** * @var ProductLinkInterfaceFactory - * @deprecated Not used anymore, search delegated. + * @deprecated 103.0.4 Not used anymore, search delegated. * @see getList() */ protected $productLinkFactory; /** * @var ProductLinkExtensionFactory - * @deprecated Not used anymore, search delegated. + * @deprecated 103.0.4 Not used anymore, search delegated. * @see getList() */ protected $productLinkExtensionFactory;
app/code/Magento/CatalogRule/composer.json+12 −11 modified@@ -6,18 +6,18 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-rule": "*", - "magento/module-store": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-rule": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-ui": "101.1.*" }, "suggest": { - "magento/module-import-export": "*", - "magento/module-catalog-rule-sample-data": "*" + "magento/module-import-export": "100.3.*", + "magento/module-catalog-rule-sample-data": "Sample Data version: 100.3.*" }, "type": "magento2-module", "license": [ @@ -31,5 +31,6 @@ "psr-4": { "Magento\\CatalogRule\\": "" } - } + }, + "version": "101.1.4-p2" }
app/code/Magento/CatalogRuleConfigurable/composer.json+7 −6 modified@@ -6,14 +6,14 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", + "magento/framework": "102.0.*", "magento/magento-composer-installer": "*", - "magento/module-catalog": "*", - "magento/module-catalog-rule": "*", - "magento/module-configurable-product": "*" + "magento/module-catalog": "103.0.*", + "magento/module-catalog-rule": "101.1.*", + "magento/module-configurable-product": "100.3.*" }, "suggest": { - "magento/module-catalog-rule": "*" + "magento/module-catalog-rule": "101.1.*" }, "type": "magento2-module", "license": [ @@ -27,5 +27,6 @@ "psr-4": { "Magento\\CatalogRuleConfigurable\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithAssignedSimpleProductsTest.xml+3 −0 modified@@ -176,6 +176,9 @@ <!-- Admin log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Create price rule --> <actionGroup ref="newCatalogPriceRuleByUI" stepKey="createPriceRule">
app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithOptionsTest.xml+3 −0 modified@@ -123,6 +123,9 @@ <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Create price rule for first configurable product option -->
app/code/Magento/CatalogRule/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithSpecialPricesTest.xml+3 −0 modified@@ -92,6 +92,9 @@ <deleteData createDataKey="createSecondConfigChildProduct" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> <deleteData createDataKey="createCategory" stepKey="deleteCategory"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Add special prices for products -->
app/code/Magento/CatalogRule/Test/Mftf/Test/AdminDeleteCatalogPriceRuleEntityTest.xml+3 −0 modified@@ -182,6 +182,9 @@ <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/> <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProductAttribute1" stepKey="deleteConfigProductAttribute1"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Delete the simple product and catalog price rule -->
app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogPriceRuleByProductAttributeTest.xml+3 −0 modified@@ -105,6 +105,9 @@ <click stepKey="resetFilters" selector="{{AdminSecondaryGridSection.resetFilters}}"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Add values to your attribute ( ex: red , green) -->
app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleAndConfigurableProductTest.xml+3 −0 modified@@ -99,6 +99,9 @@ <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> <deleteData createDataKey="createCategory" stepKey="deleteApiCategory"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Begin creating a new catalog price rule --> <actionGroup ref="newCatalogPriceRuleByUIWithConditionIsCategory" stepKey="newCatalogPriceRuleByUIWithConditionIsCategory">
app/code/Magento/CatalogSearch/composer.json+15 −14 modified@@ -6,21 +6,21 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-indexer": "*", - "magento/module-catalog-inventory": "*", - "magento/module-customer": "*", - "magento/module-directory": "*", - "magento/module-eav": "*", - "magento/module-search": "*", - "magento/module-store": "*", - "magento/module-theme": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-indexer": "100.3.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-search": "101.0.*", + "magento/module-store": "101.0.*", + "magento/module-theme": "101.0.*", + "magento/module-ui": "101.1.*" }, "suggest": { - "magento/module-config": "*" + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -34,5 +34,6 @@ "psr-4": { "Magento\\CatalogSearch\\": "" } - } + }, + "version": "101.0.4-p2" }
app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php+3 −0 modified@@ -355,6 +355,7 @@ protected function _renderFiltersBefore() /** * @inheritDoc + * @since 101.0.4 */ public function clear() { @@ -364,6 +365,7 @@ public function clear() /** * @inheritDoc + * @since 101.0.4 */ protected function _reset() { @@ -373,6 +375,7 @@ protected function _reset() /** * @inheritdoc + * @since 101.0.4 */ public function _loadEntities($printQuery = false, $logQuery = false) {
app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php+3 −0 modified@@ -381,6 +381,7 @@ public function addFieldToFilter($field, $condition = null) /** * @inheritDoc + * @since 101.0.4 */ public function clear() { @@ -390,6 +391,7 @@ public function clear() /** * @inheritDoc + * @since 101.0.4 */ protected function _reset() { @@ -399,6 +401,7 @@ protected function _reset() /** * @inheritdoc + * @since 101.0.4 */ public function _loadEntities($printQuery = false, $logQuery = false) {
app/code/Magento/CatalogSearch/Test/Mftf/Test/SearchEntityResultsTest.xml+7 −0 modified@@ -675,6 +675,13 @@ <magentoCLI command="indexer:reindex" stepKey="reindex"/> <magentoCLI command="cache:flush" stepKey="flushCache"/> </before> + <after> + <deleteData createDataKey="attributeSet" stepKey="deleteAttributeSet"/> + <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> + </after> <amOnPage url="{{StorefrontHomePage.url}}" stepKey="goToFrontPage"/> <actionGroup ref="StorefrontCheckQuickSearchStringActionGroup" stepKey="searchStorefront"> <argument name="phrase" value="$createConfigProduct.name$"/>
app/code/Magento/Catalog/Test/Mftf/Test/AdminAssignProductAttributeToAttributeSetTest.xml+3 −0 modified@@ -33,6 +33,9 @@ <after> <deleteData createDataKey="attribute" stepKey="deleteAttribute"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Go to default attribute set edit page -->
app/code/Magento/Catalog/Test/Mftf/Test/AdminChangeProductAttributeSet.xml+3 −0 modified@@ -47,6 +47,9 @@ <deleteData createDataKey="createProductAttribute" stepKey="deleteProductAttribute"/> <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/> <actionGroup ref="ClearProductsFilterActionGroup" stepKey="clearProductsFilter"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <actionGroup ref="SearchForProductOnBackendActionGroup" stepKey="searchForSimpleProduct">
app/code/Magento/Catalog/Test/Mftf/Test/AdminCheckConfigurableProductPriceWithDisabledChildProductTest.xml+3 −0 modified@@ -118,6 +118,9 @@ <deleteData createDataKey="createConfigChildProduct3" stepKey="deleteConfigChildProduct3"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteAttribute"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Open Product in Store Front Page -->
app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateAttributeSetEntityTest.xml+3 −0 modified@@ -26,6 +26,9 @@ <after> <deleteData createDataKey="createProductAttribute" stepKey="deleteProductAttribute"/> <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="goToAttributeSets"/>
app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateDropdownProductAttributeVisibleInStorefrontAdvancedSearchFormTest.xml+5 −0 modified@@ -34,7 +34,12 @@ <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> </before> <after> + <deleteData createDataKey="attribute" stepKey="deleteProductAttribute"/> + <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Filter product attribute set by attribute set name -->
app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateMultipleSelectProductAttributeVisibleInStorefrontAdvancedSearchFormTest.xml+3 −0 modified@@ -41,6 +41,9 @@ <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Filter product attribute set by attribute set name -->
app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateNewGroupForAttributeSetTest.xml+4 −0 modified@@ -27,7 +27,11 @@ </before> <after> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Navigate to Stores > Attributes > Attribute Set -->
app/code/Magento/Catalog/Test/Mftf/Test/AdminDeleteConfigurableChildProductsTest.xml+3 −0 modified@@ -82,6 +82,9 @@ <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteAttribute"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Open Product in Store Front Page --> <amOnPage url="$$createConfigProduct.sku$$.html" stepKey="openProductInStoreFront"/>
app/code/Magento/Catalog/Test/Mftf/Test/AdminDeleteDropdownProductAttributeFromAttributeSetTest.xml+3 −0 modified@@ -29,6 +29,9 @@ <!--Delete Created Data --> <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Open Product Attribute Set Page --> <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="goToAttributeSets"/>
app/code/Magento/Catalog/Test/Mftf/Test/AdminDeleteProductAttributeTest.xml+3 −0 modified@@ -23,6 +23,9 @@ </before> <after> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <actionGroup ref="deleteProductAttributeByAttributeCode" stepKey="deleteProductAttribute"> <argument name="ProductAttributeCode" value="$$createProductAttribute.attribute_code$$"/>
app/code/Magento/Catalog/Test/Mftf/Test/AdminDeleteTextFieldProductAttributeFromAttributeSetTest.xml+3 −0 modified@@ -32,6 +32,9 @@ <!--Delete cteated Data --> <deleteData createDataKey="createSimpleProduct" stepKey="deleteSimplaeProduct"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Open Product Attribute Set Page --> <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="goToAttributeSets"/>
app/code/Magento/Catalog/Test/Mftf/Test/AdminNavigateMultipleUpSellProductsTest.xml+3 −0 modified@@ -90,6 +90,9 @@ <deleteData createDataKey="createConfigChildProduct2" stepKey="deletecreateConfigChildProduct2"/> <deleteData createDataKey="createConfigChildProduct1" stepKey="deletecreateConfigChildProduct1"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Open Product Index Page-->
app/code/Magento/Catalog/Test/Mftf/Test/AdminProductGridFilteringByCustomAttributeTest.xml+3 −0 modified@@ -90,6 +90,9 @@ <deleteData createDataKey="createCategory" stepKey="deleteCategory"/> <actionGroup ref="NavigateToAndResetProductGridToDefaultView" stepKey="NavigateToAndResetProductGridToDefaultViewAfterTest"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/> <waitForPageLoad stepKey="waitForProductGridPageLoad"/>
app/code/Magento/Catalog/Test/Mftf/Test/AdminTierPriceNotAvailableForProductOptionsWithoutTierPriceTest.xml+3 −0 modified@@ -83,6 +83,9 @@ <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> <actionGroup ref="logout" stepKey="logoutOfAdmin"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Go to storefront product page an check price box css-->
app/code/Magento/Catalog/Test/Mftf/Test/AdminUnassignProductAttributeFromAttributeSetTest.xml+3 −0 modified@@ -36,6 +36,9 @@ <deleteData createDataKey="attribute" stepKey="deleteAttribute"/> <deleteData createDataKey="product" stepKey="deleteProduct"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Assert attribute presence in storefront product additional information --> <amOnPage url="/$$product.custom_attributes[url_key]$$.html" stepKey="onProductPage1"/>
app/code/Magento/Catalog/Test/Mftf/Test/DeleteUsedInConfigurableProductAttributeTest.xml+4 −1 modified@@ -73,6 +73,9 @@ <!-- Logout --> <actionGroup ref="logout" stepKey="logoutFromAdmin"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Go to Stores > Attributes > Products. Search and select the product attribute that was used to create the configurable product--> <actionGroup ref="OpenProductAttributeFromSearchResultInGridActionGroup" stepKey="openProductAttributeFromSearchResultInGrid"> @@ -102,4 +105,4 @@ <argument name="productAttribute" value="$$productAttributeHandle$$"/> </actionGroup> </test> -</tests> \ No newline at end of file +</tests>
app/code/Magento/Catalog/Test/Mftf/Test/StorefrontEnsureThatAccordionAnchorIsVisibleOnViewportOnceClickedTest.xml+4 −0 modified@@ -69,6 +69,10 @@ <deleteData createDataKey="createThirdAttribute" stepKey="deleteThirdAttribute"/> <deleteData createDataKey="createFourthAttribute" stepKey="deleteFourthAttribute"/> <deleteData createDataKey="createProduct" stepKey="deleteProduct"/> + + <actionGroup ref="logout" stepKey="logoutFromAdmin"/> + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Edit the product and set those attributes values -->
app/code/Magento/Catalog/Test/Mftf/Test/StorefrontProductsCompareWithEmptyAttributeTest.xml+3 −0 modified@@ -33,6 +33,9 @@ <deleteData createDataKey="createSimpleProduct1" stepKey="deleteSimpleProduct1"/> <deleteData createDataKey="createSimpleProduct2" stepKey="deleteSimpleProduct2"/> <actionGroup ref="logout" stepKey="logoutOfAdmin"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin1"/> <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="amOnAttributeSetPage"/>
app/code/Magento/Catalog/Test/Mftf/Test/StorefrontProductWithEmptyAttributeTest.xml+3 −0 modified@@ -29,6 +29,9 @@ <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/> <deleteData createDataKey="createProductAttribute" stepKey="deleteProductAttribute"/> <actionGroup ref="logout" stepKey="logoutOfAdmin"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin1"/> <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="amOnAttributeSetPage"/>
app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/LayoutUpdate.php+0 −1 modified@@ -50,7 +50,6 @@ private function extractLayoutUpdate(ProductInterface $product) /** * @inheritdoc - * @since 101.1.0 */ public function modifyData(array $data) {
app/code/Magento/CatalogUrlRewrite/composer.json+12 −11 modified@@ -6,18 +6,18 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-catalog-import-export": "*", - "magento/module-eav": "*", - "magento/module-import-export": "*", - "magento/module-store": "*", - "magento/module-ui": "*", - "magento/module-url-rewrite": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-import-export": "101.0.*", + "magento/module-eav": "102.0.*", + "magento/module-import-export": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-ui": "101.1.*", + "magento/module-url-rewrite": "101.1.*" }, "suggest": { - "magento/module-webapi": "*" + "magento/module-webapi": "100.3.*" }, "type": "magento2-module", "license": [ @@ -31,5 +31,6 @@ "psr-4": { "Magento\\CatalogUrlRewrite\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/CatalogUrlRewriteGraphQl/composer.json+8 −7 modified@@ -4,14 +4,14 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-store": "*", - "magento/module-catalog": "*", - "magento/framework": "*" + "magento/module-store": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/framework": "102.0.*" }, "suggest": { - "magento/module-catalog-url-rewrite": "*", - "magento/module-catalog-graph-ql": "*", - "magento/module-url-rewrite-graph-ql": "*" + "magento/module-catalog-url-rewrite": "100.3.*", + "magento/module-catalog-graph-ql": "100.3.*", + "magento/module-url-rewrite-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -24,5 +24,6 @@ "psr-4": { "Magento\\CatalogUrlRewriteGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Catalog/ViewModel/Product/Breadcrumbs.php+1 −1 modified@@ -117,7 +117,7 @@ public function getJsonConfigurationHtmlEscaped() : string * Returns breadcrumb json. * * @return string - * @deprecated 103.0.0 in favor of new method with name {suffix}Html{postfix}() + * @deprecated 102.0.11 in favor of new method with name {suffix}Html{postfix}() */ public function getJsonConfiguration() {
app/code/Magento/CatalogWidget/composer.json+12 −11 modified@@ -6,16 +6,16 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-rule": "*", - "magento/module-store": "*", - "magento/module-widget": "*", - "magento/module-wishlist": "*", - "magento/module-theme": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-rule": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-widget": "101.1.*", + "magento/module-wishlist": "101.1.*", + "magento/module-theme": "101.0.*" }, "type": "magento2-module", "license": [ @@ -29,5 +29,6 @@ "psr-4": { "Magento\\CatalogWidget\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/CheckoutAgreements/composer.json+7 −6 modified@@ -6,11 +6,11 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-checkout": "*", - "magento/module-quote": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -24,5 +24,6 @@ "psr-4": { "Magento\\CheckoutAgreements\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/CheckoutAgreementsGraphQl/composer.json+6 −5 modified@@ -4,12 +4,12 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-store": "*", - "magento/module-checkout-agreements": "*" + "magento/framework": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-checkout-agreements": "100.3.*" }, "suggest": { - "magento/module-graph-ql": "*" + "magento/module-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -22,5 +22,6 @@ "psr-4": { "Magento\\CheckoutAgreementsGraphQl\\": "" } - } + }, + "version": "100.3.1" }
app/code/Magento/Checkout/composer.json+22 −21 modified@@ -6,28 +6,28 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-directory": "*", - "magento/module-eav": "*", - "magento/module-msrp": "*", - "magento/module-page-cache": "*", - "magento/module-payment": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-sales-rule": "*", - "magento/module-shipping": "*", - "magento/module-store": "*", - "magento/module-tax": "*", - "magento/module-theme": "*", - "magento/module-ui": "*", - "magento/module-captcha": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-msrp": "100.3.*", + "magento/module-page-cache": "100.3.*", + "magento/module-payment": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-sales-rule": "101.1.*", + "magento/module-shipping": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*", + "magento/module-theme": "101.0.*", + "magento/module-ui": "101.1.*", + "magento/module-captcha": "100.3.*" }, "suggest": { - "magento/module-cookie": "*" + "magento/module-cookie": "100.3.*" }, "type": "magento2-module", "license": [ @@ -41,5 +41,6 @@ "psr-4": { "Magento\\Checkout\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/Checkout/Controller/Sidebar/RemoveItem.php+12 −1 modified@@ -7,6 +7,9 @@ use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface; +/** + * Controller for removing quote item from shopping cart. + */ class RemoveItem extends \Magento\Framework\App\Action\Action implements HttpPostActionInterface { /** @@ -56,7 +59,7 @@ public function __construct( } /** - * @return $this + * @inheritdoc */ public function execute() { @@ -67,11 +70,17 @@ public function execute() try { $this->sidebar->checkQuoteItem($itemId); $this->sidebar->removeQuoteItem($itemId); + return $this->jsonResponse(); } catch (\Magento\Framework\Exception\LocalizedException $e) { return $this->jsonResponse($e->getMessage()); + } catch (\Zend_Db_Exception $e) { + $this->logger->critical($e); + + return $this->jsonResponse(__('An unspecified error occurred. Please contact us for assistance.')); } catch (\Exception $e) { $this->logger->critical($e); + return $this->jsonResponse($e->getMessage()); } } @@ -92,6 +101,8 @@ protected function jsonResponse($error = '') } /** + * Return formKey Validator object instance. + * * @return \Magento\Framework\Data\Form\FormKey\Validator * @deprecated 100.0.9 */
app/code/Magento/Checkout/Test/Mftf/ActionGroup/AssertStorefrontOrderIsNotPlacedActionGroup.xml+17 −0 added@@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AssertStorefrontOrderIsNotPlacedActionGroup" extends="AssertStorefrontOrderCannotBePlacedActionGroup"> + <annotations> + <description>Validates order cannot be placed and checks error message.</description> + </annotations> + <remove keyForRemoval="assertErrorMessage"/> + <seeElementInDOM selector="{{CheckoutHeaderSection.errorMessageContainsText(error)}}" stepKey="assertErrorMessageInDOM"/> + </actionGroup> +</actionGroups>
app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontCheckoutClickNextOnShippingStepActionGroup.xml+17 −0 added@@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="StorefrontCheckoutClickNextOnShippingStepActionGroup" extends="StorefrontCheckoutForwardFromShippingStep"> + <annotations> + <description>Scrolls and clicks next on Checkout Shipping step</description> + </annotations> + <scrollTo selector="{{CheckoutShippingSection.next}}" before="clickNext" stepKey="scrollToNextButton"/> + </actionGroup> +</actionGroups>
app/code/Magento/Checkout/Test/Mftf/Section/CheckoutHeaderSection.xml+1 −0 modified@@ -9,5 +9,6 @@ <section name="CheckoutHeaderSection"> <element name="shippingMethodStep" type="text" selector=".opc-progress-bar-item:nth-of-type(1)"/> <element name="reviewAndPaymentsStep" type="text" selector=".opc-progress-bar-item:nth-of-type(2)"/> + <element name="errorMessageContainsText" type="text" selector="//div[contains(@class, 'message message-error error')]//div[contains(text(), '{{text}}')]" parameterized="true"/> </section> </sections>
app/code/Magento/Checkout/Test/Mftf/Test/DeleteConfigurableProductFromShoppingCartTest.xml+3 −0 modified@@ -60,6 +60,9 @@ <!-- Delete category --> <deleteData createDataKey="createCategory" stepKey="deleteCategory"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Add configurable product to the cart -->
app/code/Magento/Checkout/Test/Mftf/Test/OnePageCheckoutWithAllProductTypesTest.xml+3 −0 modified@@ -111,6 +111,9 @@ <!-- Logout customer --> <actionGroup ref="StorefrontCustomerLogoutActionGroup" stepKey="customerLogoutStorefront"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Add Simple Product to cart -->
app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml+3 −0 modified@@ -120,6 +120,9 @@ <deleteData createDataKey="createConfigProduct" stepKey="deleteProduct"/> <deleteData createDataKey="createCategory" stepKey="deleteCategory"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Add Configurable Product to the cart -->
app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckoutWithSpecialPriceProductsTest.xml+4 −1 modified@@ -102,6 +102,9 @@ <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteProductAttribute"/> <deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Open Product page in StoreFront and assert product and price range --> @@ -168,4 +171,4 @@ <!-- Assert order buttons --> <actionGroup ref="AdminAssertOrderAvailableButtonsActionGroup" stepKey="assertOrderButtons"/> </test> -</tests> \ No newline at end of file +</tests>
app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteConfigurableProductFromMiniShoppingCartTest.xml+4 −1 modified@@ -72,6 +72,9 @@ <deleteData createDataKey="createCategory" stepKey="deleteCategory"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteProductAttribute"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Add Configurable Product to the cart --> @@ -97,4 +100,4 @@ <actionGroup ref="assertMiniCartEmpty" stepKey="miniCartEnpty"/> <dontSee selector="{{StorefrontMinicartSection.productLinkByName($$createConfigProduct.name$$)}}" stepKey="verifyAssertProductAbsentInMiniShoppingCart"/> </test> -</tests> \ No newline at end of file +</tests>
app/code/Magento/Checkout/Test/Mftf/Test/StorefrontGuestCheckoutUsingFreeShippingAndTaxesTest.xml+4 −1 modified@@ -109,6 +109,9 @@ <createData entity="DefaultShippingMethodsConfig" stepKey="defaultShippingMethodsConfig"/> <createData entity="DefaultMinimumOrderAmount" stepKey="defaultMinimumOrderAmount"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Create a Tax Rule --> @@ -220,4 +223,4 @@ <argument name="customerGroup" value=""/> </actionGroup> </test> -</tests> \ No newline at end of file +</tests>
app/code/Magento/Checkout/Test/Mftf/Test/StorefrontNotApplicableShippingMethodInReviewAndPaymentStepTest.xml+2 −2 modified@@ -9,7 +9,7 @@ xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> <test name="StorefrontNotApplicableShippingMethodInReviewAndPaymentStepTest"> <annotations> - <title value="Not applicable Shipping Method In Review and Payment Step"/> + <title value="DEPRECATED. Not applicable Shipping Method In Review and Payment Step"/> <stories value="Checkout Shipping Method Recalculation after Coupon Code Added"/> <description value="User should not be able to place order when free shipping declined after applying coupon code"/> <features value="Checkout"/> @@ -18,7 +18,7 @@ <useCaseId value="MC-21926"/> <group value="Checkout"/> <skip> - <issueId value="MC-29764"/> + <issueId value="DEPRECATED">Use StorefrontShippingMethodIsNotApplicableInReviewAndPaymentStepTest instead</issueId> </skip> </annotations>
app/code/Magento/Checkout/Test/Mftf/Test/StorefrontShippingMethodIsNotApplicableInReviewAndPaymentStepTest.xml+201 −0 added@@ -0,0 +1,201 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="StorefrontShippingMethodIsNotApplicableInReviewAndPaymentStepTest"> + <annotations> + <title value="Not applicable Shipping Method In Review and Payment Step"/> + <stories value="Checkout Shipping Method Recalculation after Coupon Code Added"/> + <description value="User should not be able to place order when free shipping declined after applying coupon code"/> + <features value="Checkout"/> + <severity value="MAJOR"/> + <testCaseId value="MC-22625"/> + <useCaseId value="MC-21926"/> + <group value="checkout"/> + </annotations> + + <before> + <!-- Enable Free Shipping Method and set Minimum Order Amount to 100--> + <magentoCLI command="config:set {{AdminFreeshippingActiveConfigData.path}} {{AdminFreeshippingActiveConfigData.enabled}}" stepKey="enableFreeShippingMethod" /> + <magentoCLI command="config:set {{AdminFreeshippingMinimumOrderAmountConfigData.path}} {{AdminFreeshippingMinimumOrderAmountConfigData.hundred}}" stepKey="setFreeShippingMethodMinimumOrderAmountToBe100" /> + + <!--Set Fedex configs data--> + <magentoCLI command="config:set {{AdminFedexEnableForCheckoutConfigData.path}} {{AdminFedexEnableForCheckoutConfigData.value}}" stepKey="enableCheckout"/> + <magentoCLI command="config:set {{AdminFedexEnableSandboxModeConfigData.path}} {{AdminFedexEnableSandboxModeConfigData.value}}" stepKey="enableSandbox"/> + <magentoCLI command="config:set {{AdminFedexEnableDebugConfigData.path}} {{AdminFedexEnableDebugConfigData.value}}" stepKey="enableDebug"/> + <magentoCLI command="config:set {{AdminFedexEnableShowMethodConfigData.path}} {{AdminFedexEnableShowMethodConfigData.value}}" stepKey="enableShowMethod"/> + + <!--Set StoreInformation configs data--> + <actionGroup ref="AdminSetStoreInformationConfigurationActionGroup" stepKey="setStoreInformationConfigData"> + <argument name="telephone" value="{{DE_Address_Berlin_Not_Default_Address.telephone}}"/> + <argument name="country" value="{{DE_Address_Berlin_Not_Default_Address.country_id}}"/> + <argument name="state" value="{{DE_Address_Berlin_Not_Default_Address.state}}"/> + <argument name="city" value="{{DE_Address_Berlin_Not_Default_Address.city}}"/> + <argument name="postcode" value="{{DE_Address_Berlin_Not_Default_Address.postcode}}"/> + <argument name="street" value="{{DE_Address_Berlin_Not_Default_Address.street[0]}}"/> + </actionGroup> + + <!--Set Shipping settings origin data--> + <actionGroup ref="AdminSetShippingOriginConfigurationActionGroup" stepKey="setShippingOriginConfigurationData"> + <argument name="address" value="DE_Address_Berlin_Not_Default_Address"/> + </actionGroup> + + <!-- Create Simple Product --> + <createData entity="defaultSimpleProduct" stepKey="createSimpleProduct"> + <field key="price">100</field> + </createData> + <!-- Create Cart Price Rule with 10% discount --> + <createData entity="ApiSalesRule" stepKey="createCartPriceRule"/> + <!-- Create Coupon code for the Cart Price Rule --> + <createData entity="ApiSalesRuleCoupon" stepKey="createCartPriceRuleCoupon"> + <requiredEntity createDataKey="createCartPriceRule"/> + </createData> + <!-- Create Customer with filled Shipping & Billing Address --> + <createData entity="CustomerEntityOne" stepKey="createCustomer"/> + </before> + + <after> + <actionGroup ref="StorefrontCustomerLogoutActionGroup" stepKey="logoutFromStorefront"/> + <deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/> + <deleteData createDataKey="createCartPriceRule" stepKey="deleteCartPriceRule"/> + <deleteData createDataKey="createSimpleProduct" stepKey="deleteSimpleProduct"/> + <magentoCLI command="config:set {{AdminFreeshippingMinimumOrderAmountConfigData.path}} {{AdminFreeshippingMinimumOrderAmountConfigData.default}}" stepKey="setFreeShippingMethodMinimumOrderAmountAsDefault" /> + <magentoCLI command="config:set {{AdminFreeshippingActiveConfigData.path}} {{AdminFreeshippingActiveConfigData.disabled}}" stepKey="disableFreeShippingMethod" /> + <!--Reset configs--> + <magentoCLI command="config:set {{AdminFedexDisableForCheckoutConfigData.path}} {{AdminFedexDisableForCheckoutConfigData.value}}" stepKey="disableCheckout"/> + <magentoCLI command="config:set {{AdminFedexDisableSandboxModeConfigData.path}} {{AdminFedexDisableSandboxModeConfigData.value}}" stepKey="disableSandbox"/> + <magentoCLI command="config:set {{AdminFedexDisableDebugConfigData.path}} {{AdminFedexDisableDebugConfigData.value}}" stepKey="disableDebug"/> + <magentoCLI command="config:set {{AdminFedexDisableShowMethodConfigData.path}} {{AdminFedexDisableShowMethodConfigData.value}}" stepKey="disableShowMethod"/> + <actionGroup ref="AdminResetShippingOriginConfigurationActionGroup" stepKey="resetShippingOriginConfig"/> + <actionGroup ref="AdminSetStoreInformationConfigurationActionGroup" stepKey="resetStoreInformationConfig"> + <argument name="storeName" value=""/> + <argument name="storeHoursOfOperation" value=""/> + <argument name="vatNumber" value=""/> + <argument name="telephone" value=""/> + <argument name="country" value=""/> + <argument name="state" value=""/> + <argument name="city" value=""/> + <argument name="postcode" value=""/> + <argument name="street" value=""/> + </actionGroup> + <actionGroup ref="logout" stepKey="logoutFromAdmin"/> + </after> + + <!-- Guest Customer Test Scenario --> + <!-- Add Simple Product to Cart --> + <actionGroup ref="StorefrontAddSimpleProductToShoppingCartActionGroup" stepKey="addProductToCart"> + <argument name="product" value="$createSimpleProduct$"/> + </actionGroup> + + <!-- Go to Checkout --> + <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="goToCheckout"/> + + <!-- Fill all required fields --> + <actionGroup ref="GuestCheckoutFillNewShippingAddressActionGroup" stepKey="fillNewShippingAddress"> + <argument name="customer" value="Simple_Customer_Without_Address" /> + <argument name="address" value="US_Address_TX"/> + </actionGroup> + <waitForLoadingMaskToDisappear stepKey="waitForFreeShippingMethodAppears"/> + <!-- Select Free Shipping --> + <actionGroup ref="StorefrontSetShippingMethodActionGroup" stepKey="setShippingMethodFreeShipping"> + <argument name="shippingMethodName" value="Free Shipping"/> + </actionGroup> + + <!-- Go to Order review --> + <actionGroup ref="StorefrontCheckoutClickNextOnShippingStepActionGroup" stepKey="goToCheckoutReview"/> + + <!-- Checkout select Check/Money Order payment --> + <actionGroup ref="CheckoutSelectCheckMoneyOrderPaymentActionGroup" stepKey="selectCheckMoneyPayment"/> + <!-- Select payment solution --> + <checkOption selector="{{CheckoutPaymentSection.billingAddressNotSameCheckbox}}" stepKey="selectPaymentSolution" /> + <waitForElement selector="{{CheckoutPaymentSection.placeOrder}}" time="30" stepKey="waitForPlaceOrderButton"/> + + <!-- Apply Discount Coupon to the Order --> + <actionGroup ref="StorefrontApplyDiscountCodeActionGroup" stepKey="applyDiscountCoupon"> + <argument name="discountCode" value="$createCartPriceRuleCoupon.code$"/> + </actionGroup> + + <!-- Assert Shipping total is not yet calculated --> + <actionGroup ref="AssertStorefrontNotCalculatedValueInShippingTotalInOrderSummaryActionGroup" stepKey="assertNotYetCalculated"/> + + <!-- Assert order cannot be placed and error message will shown. --> + <actionGroup ref="AssertStorefrontOrderIsNotPlacedActionGroup" stepKey="assertOrderCannotBePlaced"> + <argument name="error" value="The shipping method is missing. Select the shipping method and try again."/> + </actionGroup> + + <!-- Go to checkout page --> + <actionGroup ref="OpenStoreFrontCheckoutShippingPageActionGroup" stepKey="openCheckoutShippingPage"/> + + <!-- Chose flat rate --> + <actionGroup ref="StorefrontSetShippingMethodActionGroup" stepKey="setShippingMethodFlatRate"> + <argument name="shippingMethodName" value="Flat Rate"/> + </actionGroup> + + <!-- Go to Order review --> + <actionGroup ref="StorefrontCheckoutClickNextOnShippingStepActionGroup" stepKey="goToCheckoutOrderReview"/> + + <!-- Place order assert succeed --> + <actionGroup ref="ClickPlaceOrderActionGroup" stepKey="checkoutPlaceOrder"/> + + <!-- Loged in Customer Test Scenario --> + <!-- Login with created Customer --> + <actionGroup ref="LoginToStorefrontActionGroup" stepKey="loginAsCustomer"> + <argument name="Customer" value="$createCustomer$"/> + </actionGroup> + + <!-- Add Simple Product to Cart --> + <actionGroup ref="StorefrontAddSimpleProductToShoppingCartActionGroup" stepKey="addSimpleProductToCart"> + <argument name="product" value="$createSimpleProduct$"/> + </actionGroup> + + <!-- Go to Checkout --> + <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="proceedToCheckout"/> + <waitForLoadingMaskToDisappear stepKey="waitForShippingMethodAppears"/> + <!-- Select Free Shipping --> + <actionGroup ref="StorefrontSetShippingMethodActionGroup" stepKey="selectFreeShippingMethod"> + <argument name="shippingMethodName" value="Free Shipping"/> + </actionGroup> + + <!-- Go to Order review --> + <actionGroup ref="StorefrontCheckoutClickNextOnShippingStepActionGroup" stepKey="goToCheckoutPaymentPage"/> + + <!-- Checkout select Check/Money Order payment --> + <actionGroup ref="CheckoutSelectCheckMoneyOrderPaymentActionGroup" stepKey="selectCheckMoneyPaymentMethod"/> + + <!-- Select payment solution --> + <checkOption selector="{{CheckoutPaymentSection.billingAddressNotSameCheckbox}}" stepKey="checkBillingAddressNotSameCheckbox"/> + <waitForElementVisible selector="{{CheckoutPaymentSection.placeOrder}}" time="30" stepKey="waitForPlaceOrderButtonVisible"/> + + <!-- Apply Discount Coupon to the Order --> + <actionGroup ref="StorefrontApplyDiscountCodeActionGroup" stepKey="applyDiscountCouponCode"> + <argument name="discountCode" value="$createCartPriceRuleCoupon.code$"/> + </actionGroup> + + <!-- Assert Shipping total is not yet calculated --> + <actionGroup ref="AssertStorefrontNotCalculatedValueInShippingTotalInOrderSummaryActionGroup" stepKey="assertShippingTotalNotYetCalculated"/> + + <!-- Assert order cannot be placed and error message will shown. --> + <actionGroup ref="AssertStorefrontOrderIsNotPlacedActionGroup" stepKey="assertOrderIsNotPlaced"> + <argument name="error" value="The shipping method is missing. Select the shipping method and try again."/> + </actionGroup> + + <!-- Go to checkout page --> + <actionGroup ref="OpenStoreFrontCheckoutShippingPageActionGroup" stepKey="goToCheckoutShippingPage"/> + + <!-- Chose flat rate --> + <actionGroup ref="StorefrontSetShippingMethodActionGroup" stepKey="selectFlatRateShippingMethod"> + <argument name="shippingMethodName" value="Flat Rate"/> + </actionGroup> + + <!-- Go to Order review --> + <actionGroup ref="StorefrontCheckoutClickNextOnShippingStepActionGroup" stepKey="goToCheckoutPaymentStep"/> + + <!-- Place order assert succeed --> + <actionGroup ref="ClickPlaceOrderActionGroup" stepKey="placeOrder"/> + </test> +</tests>
app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/RemoveItemTest.php+46 −0 modified@@ -234,6 +234,52 @@ public function testExecuteWithException() $this->assertEquals('json represented', $this->removeItem->execute()); } + /** + * Test controller when DB exception is thrown. + * + * @return void + */ + public function testExecuteWithDbException(): void + { + $itemId = 1; + $dbError = 'Error'; + $message = __('An unspecified error occurred. Please contact us for assistance.'); + $response = [ + 'success' => false, + 'error_message' => $message, + ]; + + $this->getPropertyValue($this->removeItem, 'formKeyValidator') + ->expects($this->once()) + ->method('validate') + ->with($this->requestMock) + ->willReturn(true); + $this->requestMock->expects($this->once())->method('getParam')->with('item_id')->willReturn($itemId); + + $exception = new \Zend_Db_Exception($dbError); + + $this->sidebarMock->expects($this->once()) + ->method('checkQuoteItem') + ->with($itemId) + ->willThrowException($exception); + + $this->loggerMock->expects($this->once())->method('critical')->with($exception); + + $this->sidebarMock->expects($this->once())->method('getResponseData')->with($message)->willReturn($response); + $encodedResponse = json_encode($response); + $this->jsonHelperMock->expects($this->once()) + ->method('jsonEncode') + ->with($response) + ->willReturn($encodedResponse); + + $this->responseMock->expects($this->once()) + ->method('representJson') + ->with($encodedResponse) + ->willReturn($this->responseMock); + + $this->removeItem->execute(); + } + public function testExecuteWhenFormKeyValidationFailed() { $resultRedirect = $this->createMock(\Magento\Framework\Controller\Result\Redirect::class);
app/code/Magento/Cms/Api/Data/PageInterface.php+4 −4 modified@@ -125,7 +125,7 @@ public function getSortOrder(); * Get layout update xml * * @return string|null - * @deprecated Existing updates are applied, new are not accepted. + * @deprecated 103.0.4 Existing updates are applied, new are not accepted. */ public function getLayoutUpdateXml(); @@ -146,7 +146,7 @@ public function getCustomRootTemplate(); /** * Get custom layout update xml * - * @deprecated Existing updates are applied, new are not accepted. + * @deprecated 103.0.4 Existing updates are applied, new are not accepted. * @see \Magento\Cms\Model\Page\CustomLayout\Data\CustomLayoutSelectedInterface * @return string|null */ @@ -275,7 +275,7 @@ public function setSortOrder($sortOrder); * * @param string $layoutUpdateXml * @return \Magento\Cms\Api\Data\PageInterface - * @deprecated Existing updates are applied, new are not accepted. + * @deprecated 103.0.4 Existing updates are applied, new are not accepted. */ public function setLayoutUpdateXml($layoutUpdateXml); @@ -300,7 +300,7 @@ public function setCustomRootTemplate($customRootTemplate); * * @param string $customLayoutUpdateXml * @return \Magento\Cms\Api\Data\PageInterface - * @deprecated Existing updates are applied, new are not accepted. + * @deprecated 103.0.4 Existing updates are applied, new are not accepted. * @see \Magento\Cms\Model\Page\CustomLayout\Data\CustomLayoutSelectedInterface */ public function setCustomLayoutUpdateXml($customLayoutUpdateXml);
app/code/Magento/Cms/composer.json+13 −12 modified@@ -6,19 +6,19 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-email": "*", - "magento/module-media-storage": "*", - "magento/module-store": "*", - "magento/module-theme": "*", - "magento/module-ui": "*", - "magento/module-variable": "*", - "magento/module-widget": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-email": "101.0.*", + "magento/module-media-storage": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-theme": "101.0.*", + "magento/module-ui": "101.1.*", + "magento/module-variable": "100.3.*", + "magento/module-widget": "101.1.*" }, "suggest": { - "magento/module-cms-sample-data": "*" + "magento/module-cms-sample-data": "Sample Data version: 100.3.*" }, "type": "magento2-module", "license": [ @@ -32,5 +32,6 @@ "psr-4": { "Magento\\Cms\\": "" } - } + }, + "version": "103.0.4-p2" }
app/code/Magento/Cms/Controller/Adminhtml/Page/PostDataProcessor.php+1 −1 modified@@ -79,7 +79,7 @@ public function filter($data) * * @param array $data * @return bool Return FALSE if some item is invalid - * @deprecated 103.0.3 + * @deprecated 103.0.2 */ public function validate($data) {
app/code/Magento/CmsGraphQl/composer.json+8 −7 modified@@ -4,14 +4,14 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-cms": "*", - "magento/module-widget": "*" + "magento/framework": "102.0.*", + "magento/module-cms": "103.0.*", + "magento/module-widget": "101.1.*" }, "suggest": { - "magento/module-graph-ql": "*", - "magento/module-graph-ql-cache": "*", - "magento/module-store-graph-ql": "*" + "magento/module-graph-ql": "100.3.*", + "magento/module-graph-ql-cache": "100.3.*", + "magento/module-store-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -24,5 +24,6 @@ "psr-4": { "Magento\\CmsGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Cms/Model/Template/Filter.php+2 −4 modified@@ -5,8 +5,6 @@ */ namespace Magento\Cms\Model\Template; -use Magento\Framework\Exception\LocalizedException; - /** * Cms Template Filter Model */ @@ -41,8 +39,8 @@ public function mediaDirective($construction) { // phpcs:ignore Magento2.Functions.DiscouragedFunction $params = $this->getParameters(html_entity_decode($construction[2], ENT_QUOTES)); - if (preg_match('/\.\.(\\\|\/)/', $params['url'])) { - throw new \InvalidArgumentException('Image path must be absolute'); + if (preg_match('/(^.*:\/\/.*|\.\.\/.*)/', $params['url'])) { + throw new \InvalidArgumentException('Image path must be absolute and not include URLs'); } return $this->_storeManager->getStore()->getBaseMediaDir() . '/' . $params['url'];
app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php+20 −0 modified@@ -105,4 +105,24 @@ public function testMediaDirectiveRelativePath() ->willReturn($baseMediaDir); $this->filter->mediaDirective($construction); } + + /** + * Test using media directive with a URL path including schema. + * + * @covers \Magento\Cms\Model\Template\Filter::mediaDirective + * @expectedException \InvalidArgumentException + */ + public function testMediaDirectiveURL() + { + $baseMediaDir = 'pub/media'; + $construction = [ + '{{media url="http://wysiwyg/images/image.jpg"}}', + 'media', + ' url="http://wysiwyg/images/../image.jpg"' + ]; + $this->storeMock->expects($this->any()) + ->method('getBaseMediaDir') + ->willReturn($baseMediaDir); + $this->filter->mediaDirective($construction); + } }
app/code/Magento/CmsUrlRewrite/composer.json+6 −5 modified@@ -6,10 +6,10 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-cms": "*", - "magento/module-store": "*", - "magento/module-url-rewrite": "*" + "magento/framework": "102.0.*", + "magento/module-cms": "103.0.*", + "magento/module-store": "101.0.*", + "magento/module-url-rewrite": "101.1.*" }, "type": "magento2-module", "license": [ @@ -23,5 +23,6 @@ "psr-4": { "Magento\\CmsUrlRewrite\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/CmsUrlRewriteGraphQl/composer.json+8 −7 modified@@ -4,14 +4,14 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-cms": "*", - "magento/module-store": "*", - "magento/module-url-rewrite-graph-ql": "*" + "magento/framework": "102.0.*", + "magento/module-cms": "103.0.*", + "magento/module-store": "101.0.*", + "magento/module-url-rewrite-graph-ql": "100.3.*" }, "suggest": { - "magento/module-cms-url-rewrite": "*", - "magento/module-catalog-graph-ql": "*" + "magento/module-cms-url-rewrite": "100.3.*", + "magento/module-catalog-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -24,5 +24,6 @@ "psr-4": { "Magento\\CmsUrlRewriteGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Config/composer.json+10 −9 modified@@ -6,14 +6,14 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-cron": "*", - "magento/module-deploy": "*", - "magento/module-directory": "*", - "magento/module-email": "*", - "magento/module-media-storage": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-cron": "100.3.*", + "magento/module-deploy": "100.3.*", + "magento/module-directory": "100.3.*", + "magento/module-email": "101.0.*", + "magento/module-media-storage": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -27,5 +27,6 @@ "psr-4": { "Magento\\Config\\": "" } - } + }, + "version": "101.1.4-p2" }
app/code/Magento/ConfigurableImportExport/composer.json+9 −8 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-catalog-import-export": "*", - "magento/module-configurable-product": "*", - "magento/module-eav": "*", - "magento/module-import-export": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-import-export": "101.0.*", + "magento/module-configurable-product": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-import-export": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\ConfigurableImportExport\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/ConfigurableProduct/composer.json+21 −20 modified@@ -6,27 +6,27 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-checkout": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-media-storage": "*", - "magento/module-quote": "*", - "magento/module-store": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-checkout": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-media-storage": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-store": "101.0.*", + "magento/module-ui": "101.1.*" }, "suggest": { - "magento/module-msrp": "*", - "magento/module-webapi": "*", - "magento/module-sales": "*", - "magento/module-sales-rule": "*", - "magento/module-product-video": "*", - "magento/module-configurable-sample-data": "*", - "magento/module-product-links-sample-data": "*", - "magento/module-tax": "*" + "magento/module-msrp": "100.3.*", + "magento/module-webapi": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-sales-rule": "101.1.*", + "magento/module-product-video": "100.3.*", + "magento/module-configurable-sample-data": "Sample Data version: 100.3.*", + "magento/module-product-links-sample-data": "Sample Data version: 100.3.*", + "magento/module-tax": "100.3.*" }, "type": "magento2-module", "license": [ @@ -40,5 +40,6 @@ "psr-4": { "Magento\\ConfigurableProduct\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/ConfigurableProductGraphQl/composer.json+8 −7 modified@@ -4,12 +4,12 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-catalog": "*", - "magento/module-configurable-product": "*", - "magento/module-catalog-graph-ql": "*", - "magento/module-quote": "*", - "magento/module-quote-graph-ql": "*", - "magento/framework": "*" + "magento/module-catalog": "103.0.*", + "magento/module-configurable-product": "100.3.*", + "magento/module-catalog-graph-ql": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-quote-graph-ql": "100.3.*", + "magento/framework": "102.0.*" }, "license": [ "OSL-3.0", @@ -22,5 +22,6 @@ "psr-4": { "Magento\\ConfigurableProductGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/ConfigurableProductSales/composer.json+7 −6 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-sales": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-configurable-product": "*" + "magento/module-configurable-product": "100.3.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\ConfigurableProductSales\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminAddDefaultImageConfigurableTest.xml+3 −0 modified@@ -89,6 +89,9 @@ <deleteData createDataKey="baseConfigProductHandle" stepKey="deleteConfig"/> <deleteData createDataKey="categoryHandle" stepKey="deleteCategory"/> <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="productIndexPage"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCheckConfigurableProductAttributeValueUniquenessTest.xml+3 −0 modified@@ -34,6 +34,9 @@ <deleteData createDataKey="createCategory" stepKey="deleteCategory"/> <deleteData createDataKey="createProductAttribute" stepKey="deleteAttribute"/> <actionGroup ref="logout" stepKey="logOut"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Create configurable product--> <comment userInput="Create configurable product" stepKey="createConfProd"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCheckResultsOfColorAndOtherFiltersTest.xml+3 −0 modified@@ -109,6 +109,9 @@ <actionGroup ref="AdminClearFiltersActionGroup" stepKey="clearProductsGridFilter"/> <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Create three configurable products with options --> <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="amOnProductGridPage"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCheckValidatorConfigurableProductTest.xml+3 −0 modified@@ -44,6 +44,9 @@ <argument name="ProductAttribute" value="productDropDownAttribute"/> </actionGroup> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Find the product that we just created using the product grid -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductDeleteTest.xml+6 −0 modified@@ -70,6 +70,9 @@ <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/> <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- assert product visible in storefront --> @@ -225,6 +228,9 @@ <deleteData createDataKey="createConfigChildProduct6" stepKey="deleteConfigChildProduct6"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> <deleteData createDataKey="createCategory" stepKey="deleteCategory"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Search for prefix of the 3 products we created via api -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductLongSkuTest.xml+3 −0 modified@@ -53,6 +53,9 @@ <!--Clean up category--> <deleteData createDataKey="createCategory" stepKey="deleteCategory"/> <actionGroup ref="logout" stepKey="adminLogout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Create a configurable product with long name and sku-->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductOutOfStockTest.xml+9 −0 modified@@ -83,6 +83,9 @@ <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/> <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Check to make sure that the configurable product shows up as in stock --> @@ -204,6 +207,9 @@ <deleteData createDataKey="createCategory" stepKey="deleteCategory"/> <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Check to make sure that the configurable product shows up as in stock --> @@ -306,6 +312,9 @@ <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Check to make sure that the configurable product shows up as in stock -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductSearchTest.xml+6 −0 modified@@ -73,6 +73,9 @@ <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/> <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="goToProductList"/> @@ -152,6 +155,9 @@ <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/> <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="goToProductList"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductUpdateAttributeTest.xml+6 −0 modified@@ -105,6 +105,9 @@ <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createModifiableProductAttribute" stepKey="deleteModifiableProductAttribute"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Get the current option of the attribute before it was changed --> @@ -221,6 +224,9 @@ <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/> <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Find the product that we just created using the product grid -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductUpdateTest.xml+6 −0 modified@@ -145,6 +145,9 @@ <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + <actionGroup ref="logout" stepKey="logout"/> + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--check storefront for both options--> @@ -238,6 +241,9 @@ <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--check storefront for both options-->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithDisabledChildrenProductsTest.xml+3 −0 modified@@ -54,6 +54,9 @@ <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Create configurable product -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithImagesTest.xml+3 −0 modified@@ -57,6 +57,9 @@ <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Create configurable product -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithThreeProductDisplayOutOfStockProductsTest.xml+4 −1 modified@@ -77,6 +77,9 @@ <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Create configurable product --> @@ -137,4 +140,4 @@ <waitForPageLoad stepKey="waitForProductPageLoad"/> <see userInput="$$createConfigProductAttributeOptionThree.option[store_labels][1][label]$$" selector="{{StorefrontProductInfoMainSection.optionByAttributeId($$createConfigProductAttribute.attribute_id$$)}}" stepKey="assertOptionNotAvailable" /> </test> -</tests> \ No newline at end of file +</tests>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithThreeProductDontDisplayOutOfStockProductsTest.xml+4 −1 modified@@ -74,6 +74,9 @@ <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Create configurable product --> @@ -131,4 +134,4 @@ <waitForPageLoad stepKey="waitForPageLoad"/> <dontSee userInput="$$createConfigProductAttributeOptionThree.option[store_labels][1][label]$$" selector="{{StorefrontProductInfoMainSection.optionByAttributeId($$createConfigProductAttribute.attribute_id$$)}}" stepKey="assertOptionNotAvailable"/> </test> -</tests> \ No newline at end of file +</tests>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithTierPriceForOneItemTest.xml+3 −0 modified@@ -65,6 +65,9 @@ <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Create configurable product -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminProductTypeSwitchingOnEditingTest.xml+6 −0 modified@@ -44,6 +44,9 @@ </actionGroup> <actionGroup ref="AdminClearFiltersActionGroup" stepKey="clearProductFilters"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Add configurations to product--> <comment userInput="Add configurations to product" stepKey="commentAddConfigs"/> @@ -148,6 +151,9 @@ </actionGroup> <actionGroup ref="AdminClearFiltersActionGroup" stepKey="clearProductFilters"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Add configurations to product--> <comment userInput="Add configurations to product" stepKey="commentAddConfigurations"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminRelatedProductsTest.xml+3 −0 modified@@ -89,6 +89,9 @@ <deleteData createDataKey="baseConfigProductHandle" stepKey="deleteConfig"/> <deleteData createDataKey="categoryHandle" stepKey="deleteCategory"/> <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <comment userInput="Filter and edit simple product 1" stepKey="filterAndEditComment1"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminRemoveDefaultImageConfigurableTest.xml+2 −0 modified@@ -89,6 +89,8 @@ <deleteData createDataKey="baseConfigProductHandle" stepKey="deleteConfig"/> <deleteData createDataKey="categoryHandle" stepKey="deleteCategory"/> <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductAttribute"/> + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="productIndexPage"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdvanceCatalogSearchConfigurableTest.xml+16 −0 modified@@ -82,6 +82,10 @@ <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/> <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/> <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/> + <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> </test> <test name="AdvanceCatalogSearchConfigurableBySkuTest" extends="AdvanceCatalogSearchSimpleProductBySkuTest"> @@ -158,6 +162,10 @@ <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/> <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/> <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/> + <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> </test> <test name="AdvanceCatalogSearchConfigurableByDescriptionTest" extends="AdvanceCatalogSearchSimpleProductByDescriptionTest"> @@ -234,6 +242,10 @@ <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/> <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/> <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/> + <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> </test> <test name="AdvanceCatalogSearchConfigurableByShortDescriptionTest" extends="AdvanceCatalogSearchSimpleProductByShortDescriptionTest"> @@ -310,6 +322,10 @@ <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/> <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/> <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/> + <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> </test> </tests>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/ConfigurableProductPriceAdditionalStoreViewTest.xml+2 −0 modified@@ -78,6 +78,8 @@ <argument name="websiteName" value="Second Website"/> </actionGroup> <actionGroup ref="logout" stepKey="adminLogout"/> + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <actionGroup ref="EnableWebUrlOptions" stepKey="addStoreCodeToUrls"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml+6 −0 modified@@ -73,6 +73,9 @@ <!--<deleteData createDataKey="createConfigProductImage" stepKey="deleteConfigProductImage"/>--> <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Verify Configurable Product in checkout cart items --> @@ -282,6 +285,9 @@ <!--<deleteData createDataKey="createConfigProductImage" stepKey="deleteConfigProductImage"/>--> <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Verify Configurable Product in checkout cart items -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml+3 −0 modified@@ -73,6 +73,9 @@ <!--<deleteData createDataKey="createConfigProductImage" stepKey="deleteConfigProductImage"/>--> <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Verify Configurable Product in checkout cart items -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/NewProductsListWidgetConfigurableProductTest.xml+4 −1 modified@@ -70,6 +70,9 @@ <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/> <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- A Cms page containing the New Products Widget gets created here via extends --> @@ -88,4 +91,4 @@ <waitForPageLoad stepKey="waitForCmsPage"/> <see selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" userInput="$$createConfigProduct.name$$" stepKey="seeProductName"/> </test> -</tests> \ No newline at end of file +</tests>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/NoOptionAvailableToConfigureDisabledProductTest.xml+3 −0 modified@@ -103,6 +103,9 @@ <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> <deleteData createDataKey="createCustomer" stepKey="deleteCreatedCustomer"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Disable child product --> <comment userInput="Disable child product" stepKey="disableChildProduct"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontAdvanceCatalogSearchConfigurableBySkuWithHyphenTest.xml+4 −0 modified@@ -83,6 +83,10 @@ <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/> <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/> <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/> + <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> </test> </tests>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductCategoryViewChildOnlyTest.xml+3 −0 modified@@ -95,6 +95,9 @@ <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> <deleteData createDataKey="createCategory" stepKey="deleteApiCategory"/> <deleteData createDataKey="secondCategory" stepKey="deleteSecondCategory"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <actionGroup ref="LoginAsAdmin" stepKey="login"/>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductChildSearchTest.xml+4 −1 modified@@ -140,6 +140,9 @@ <deleteData createDataKey="createConfigProductAttributeMultiSelect" stepKey="deleteConfigProductAttributeMultiSelect"/> <deleteData createDataKey="createConfigProductAttributeSelect" stepKey="deleteConfigProductAttributeSelect"/> <deleteData createDataKey="createCategory" stepKey="deleteApiCategory"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Quick search the storefront for the first attribute option --> @@ -156,4 +159,4 @@ <submitForm selector="#search_mini_form" parameterArray="['q' => $$createConfigChildProduct1.custom_attributes[short_description]$$]" stepKey="searchStorefront3" /> <seeElement stepKey="seeProduct3" selector="{{StorefrontCategoryProductSection.ProductTitleByName('$$createConfigProduct.name$$')}}"/> </test> -</tests> \ No newline at end of file +</tests>
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductDetailsTest.xml+3 −0 modified@@ -36,6 +36,9 @@ </actionGroup> <actionGroup ref="clearFiltersAdminDataGrid" stepKey="clearProductsGridFilters"/> <actionGroup ref="logout" stepKey="adminLogout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Verify configurable product details in storefront product view -->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontSortingByPriceForConfigurableWithCatalogRuleAppliedTest.xml+3 −0 modified@@ -117,6 +117,9 @@ <argument name="option" value="No"/> </actionGroup> <actionGroup ref="logout" stepKey="logoutFromAdmin"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Open category with products and Sort by price desc-->
app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontVerifyConfigurableProductLayeredNavigationTest.xml+3 −0 modified@@ -117,6 +117,9 @@ <deleteData createDataKey="createConfigChildProduct3" stepKey="deleteConfigChildProduct3"/> <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteAttribute"/> <actionGroup ref="logout" stepKey="logout"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Open Product Index Page and Filter First Child product -->
app/code/Magento/Contact/composer.json+7 −6 modified@@ -6,11 +6,11 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-cms": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-cms": "103.0.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -24,5 +24,6 @@ "psr-4": { "Magento\\Contact\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Cookie/composer.json+5 −4 modified@@ -6,11 +6,11 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-backend": "*" + "magento/module-backend": "101.0.*" }, "type": "magento2-module", "license": [ @@ -24,5 +24,6 @@ "psr-4": { "Magento\\Cookie\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Cron/composer.json+5 −4 modified@@ -6,11 +6,11 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-config": "*" + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -24,5 +24,6 @@ "psr-4": { "Magento\\Cron\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/CurrencySymbol/composer.json+8 −7 modified@@ -6,12 +6,12 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-config": "*", - "magento/module-directory": "*", - "magento/module-page-cache": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-config": "101.1.*", + "magento/module-directory": "100.3.*", + "magento/module-page-cache": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -25,5 +25,6 @@ "psr-4": { "Magento\\CurrencySymbol\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/CustomerAnalytics/composer.json+5 −4 modified@@ -3,9 +3,9 @@ "description": "N/A", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-customer": "*", - "magento/module-analytics": "*" + "magento/framework": "102.0.*", + "magento/module-customer": "102.0.*", + "magento/module-analytics": "100.3.*" }, "type": "magento2-module", "license": [ @@ -19,5 +19,6 @@ "psr-4": { "Magento\\CustomerAnalytics\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Customer/Api/SessionCleanerInterface.php+22 −0 added@@ -0,0 +1,22 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +declare(strict_types=1); + +namespace Magento\Customer\Api; + +/** + * Interface for cleaning customer session data. + */ +interface SessionCleanerInterface +{ + /** + * Destroy all active customer sessions related to given customer id, including current session. + * + * @param int $customerId + * @return void + */ + public function clearFor(int $customerId): void; +}
app/code/Magento/Customer/composer.json+24 −23 modified@@ -6,30 +6,30 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-authorization": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-checkout": "*", - "magento/module-config": "*", - "magento/module-directory": "*", - "magento/module-eav": "*", - "magento/module-integration": "*", - "magento/module-media-storage": "*", - "magento/module-newsletter": "*", - "magento/module-page-cache": "*", - "magento/module-quote": "*", - "magento/module-review": "*", - "magento/module-sales": "*", - "magento/module-store": "*", - "magento/module-tax": "*", - "magento/module-theme": "*", - "magento/module-ui": "*", - "magento/module-wishlist": "*" + "magento/framework": "102.0.*", + "magento/module-authorization": "100.3.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-config": "101.1.*", + "magento/module-directory": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-integration": "100.3.*", + "magento/module-media-storage": "100.3.*", + "magento/module-newsletter": "100.3.*", + "magento/module-page-cache": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-review": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*", + "magento/module-theme": "101.0.*", + "magento/module-ui": "101.1.*", + "magento/module-wishlist": "101.1.*" }, "suggest": { - "magento/module-cookie": "*", - "magento/module-customer-sample-data": "*" + "magento/module-cookie": "100.3.*", + "magento/module-customer-sample-data": "Sample Data version: 100.3.*" }, "type": "magento2-module", "license": [ @@ -43,5 +43,6 @@ "psr-4": { "Magento\\Customer\\": "" } - } + }, + "version": "102.0.4-p2" }
app/code/Magento/Customer/Controller/Account/CreatePost.php+1 −1 modified@@ -440,7 +440,7 @@ protected function checkPasswordConfirmation($password, $confirmation) /** * Retrieve success message * - * @deprecated + * @deprecated 102.0.4 * @see getMessageManagerSuccessMessage() * @return string */
app/code/Magento/Customer/CustomerData/SectionPool.php+1 −0 modified@@ -66,6 +66,7 @@ public function getSectionsData(array $sectionNames = null, $forceNewTimestamp = * Return array of section names. * * @return array + * @since 102.0.4 */ public function getSectionNames() {
app/code/Magento/CustomerDownloadableGraphQl/composer.json+6 −5 modified@@ -4,12 +4,12 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-downloadable-graph-ql": "*", - "magento/module-graph-ql": "*", - "magento/framework": "*" + "magento/module-downloadable-graph-ql": "100.3.*", + "magento/module-graph-ql": "100.3.*", + "magento/framework": "102.0.*" }, "suggest": { - "magento/module-catalog-graph-ql": "*" + "magento/module-catalog-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -22,5 +22,6 @@ "psr-4": { "Magento\\CustomerDownloadableGraphQl\\": "" } - } + }, + "version": "100.3.0" }
app/code/Magento/Customer/etc/di.xml+1 −0 modified@@ -61,6 +61,7 @@ type="Magento\Customer\Block\Account\SortLink"/> <preference for="Magento\Customer\Model\Group\RetrieverInterface" type="Magento\Customer\Model\Group\Retriever"/> + <preference for="Magento\Customer\Api\SessionCleanerInterface" type="Magento\Customer\Model\Session\SessionCleaner"/> <type name="Magento\Customer\Model\Session"> <arguments> <argument name="configShare" xsi:type="object">Magento\Customer\Model\Config\Share\Proxy</argument>
app/code/Magento/Customer/etc/webapi.xml+1 −0 modified@@ -141,6 +141,7 @@ </resources> <data> <parameter name="customer.id" force="true">%customer_id%</parameter> + <parameter name="customer.group_id" force="true">null</parameter> </data> </route> <route url="/V1/customers/me" method="GET" soapOperation="getSelf">
app/code/Magento/CustomerGraphQl/composer.json+26 −26 modified@@ -1,29 +1,29 @@ { - "name": "magento/module-customer-graph-ql", - "description": "N/A", - "type": "magento2-module", - "require": { - "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-customer": "*", - "magento/module-authorization": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-graph-ql": "*", - "magento/module-newsletter": "*", - "magento/module-integration": "*", - "magento/module-store": "*", - "magento/framework": "*" - }, - "license": [ - "OSL-3.0", - "AFL-3.0" - ], - "autoload": { - "files": [ - "registration.php" + "name": "magento/module-customer-graph-ql", + "description": "N/A", + "type": "magento2-module", + "require": { + "php": "~7.1.3||~7.2.0||~7.3.0", + "magento/module-customer": "102.0.*", + "magento/module-authorization": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-graph-ql": "100.3.*", + "magento/module-newsletter": "100.3.*", + "magento/module-integration": "100.3.*", + "magento/module-store": "101.0.*", + "magento/framework": "102.0.*" + }, + "license": [ + "OSL-3.0", + "AFL-3.0" ], - "psr-4": { - "Magento\\CustomerGraphQl\\": "" - } - } + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CustomerGraphQl\\": "" + } + }, + "version": "100.3.4" }
app/code/Magento/CustomerImportExport/composer.json+9 −8 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-customer": "*", - "magento/module-directory": "*", - "magento/module-eav": "*", - "magento/module-import-export": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-customer": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-import-export": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\CustomerImportExport\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/CustomerImportExport/Model/Import/Address.php+4 −4 modified@@ -165,7 +165,7 @@ class Address extends AbstractCustomer * Array of region parameters * * @var array - * @deprecated field not in use + * @deprecated 100.3.4 field not in use */ protected $_regionParameters; @@ -195,19 +195,19 @@ class Address extends AbstractCustomer /** * @var \Magento\Eav\Model\Config - * @deprecated field not-in use + * @deprecated 100.3.4 field not-in use */ protected $_eavConfig; /** * @var \Magento\Customer\Model\AddressFactory - * @deprecated not utilized anymore + * @deprecated 100.3.4 not utilized anymore */ protected $_addressFactory; /** * @var \Magento\Framework\Stdlib\DateTime - * @deprecated the property isn't used + * @deprecated 100.3.4 the property isn't used */ protected $dateTime;
app/code/Magento/Customer/Model/AccountManagement.php+48 −76 modified@@ -13,6 +13,7 @@ use Magento\Customer\Api\Data\AddressInterface; use Magento\Customer\Api\Data\CustomerInterface; use Magento\Customer\Api\Data\ValidationResultsInterfaceFactory; +use Magento\Customer\Api\SessionCleanerInterface; use Magento\Customer\Helper\View as CustomerViewHelper; use Magento\Customer\Model\Config\Share as ConfigShare; use Magento\Customer\Model\Customer as CustomerModel; @@ -68,92 +69,104 @@ class AccountManagement implements AccountManagementInterface /** * Configuration paths for create account email template * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_REGISTER_EMAIL_TEMPLATE = 'customer/create_account/email_template'; /** * Configuration paths for register no password email template * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotification::XML_PATH_REGISTER_NO_PASSWORD_EMAIL_TEMPLATE */ const XML_PATH_REGISTER_NO_PASSWORD_EMAIL_TEMPLATE = 'customer/create_account/email_no_password_template'; /** * Configuration paths for remind email identity * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotification::XML_PATH_REGISTER_EMAIL_IDENTITY */ const XML_PATH_REGISTER_EMAIL_IDENTITY = 'customer/create_account/email_identity'; /** * Configuration paths for remind email template * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotification::XML_PATH_REMIND_EMAIL_TEMPLATE */ const XML_PATH_REMIND_EMAIL_TEMPLATE = 'customer/password/remind_email_template'; /** * Configuration paths for forgot email email template * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotification::XML_PATH_FORGOT_EMAIL_TEMPLATE */ const XML_PATH_FORGOT_EMAIL_TEMPLATE = 'customer/password/forgot_email_template'; /** * Configuration paths for forgot email identity * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotification::XML_PATH_FORGOT_EMAIL_IDENTITY */ const XML_PATH_FORGOT_EMAIL_IDENTITY = 'customer/password/forgot_email_identity'; /** * Configuration paths for account confirmation required * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. * @see AccountConfirmation::XML_PATH_IS_CONFIRM */ const XML_PATH_IS_CONFIRM = 'customer/create_account/confirm'; /** * Configuration paths for account confirmation email template * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotification::XML_PATH_CONFIRM_EMAIL_TEMPLATE */ const XML_PATH_CONFIRM_EMAIL_TEMPLATE = 'customer/create_account/email_confirmation_template'; /** * Configuration paths for confirmation confirmed email template * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotification::XML_PATH_CONFIRMED_EMAIL_TEMPLATE */ const XML_PATH_CONFIRMED_EMAIL_TEMPLATE = 'customer/create_account/email_confirmed_template'; /** * Constants for the type of new account email to be sent * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotificationInterface::NEW_ACCOUNT_EMAIL_REGISTERED */ const NEW_ACCOUNT_EMAIL_REGISTERED = 'registered'; /** * Welcome email, when password setting is required * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotificationInterface::NEW_ACCOUNT_EMAIL_REGISTERED_NO_PASSWORD */ const NEW_ACCOUNT_EMAIL_REGISTERED_NO_PASSWORD = 'registered_no_password'; /** * Welcome email, when confirmation is enabled * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotificationInterface::NEW_ACCOUNT_EMAIL_CONFIRMATION */ const NEW_ACCOUNT_EMAIL_CONFIRMATION = 'confirmation'; /** * Confirmation email, when account is confirmed * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotificationInterface::NEW_ACCOUNT_EMAIL_CONFIRMED */ const NEW_ACCOUNT_EMAIL_CONFIRMED = 'confirmed'; @@ -179,14 +192,16 @@ class AccountManagement implements AccountManagementInterface /** * Configuration path to customer reset password email template * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\EmailNotification::XML_PATH_RESET_PASSWORD_TEMPLATE */ const XML_PATH_RESET_PASSWORD_TEMPLATE = 'customer/password/reset_password_template'; /** * Minimum password length * - * @deprecated + * @deprecated get rid of Helpers in Password Security Management. + * @see \Magento\Customer\Model\AccountManagement::XML_PATH_MINIMUM_PASSWORD_LENGTH */ const MIN_PASSWORD_LENGTH = 6; @@ -270,21 +285,6 @@ class AccountManagement implements AccountManagementInterface */ private $transportBuilder; - /** - * @var SessionManagerInterface - */ - private $sessionManager; - - /** - * @var SaveHandlerInterface - */ - private $saveHandler; - - /** - * @var CollectionFactory - */ - private $visitorCollectionFactory; - /** * @var DataObjectProcessor */ @@ -370,6 +370,11 @@ class AccountManagement implements AccountManagementInterface */ private $getByToken; + /** + * @var SessionCleanerInterface + */ + private $sessionCleaner; + /** * @param CustomerFactory $customerFactory * @param ManagerInterface $eventManager @@ -404,10 +409,12 @@ class AccountManagement implements AccountManagementInterface * @param AddressRegistry|null $addressRegistry * @param GetCustomerByToken|null $getByToken * @param AllowedCountries|null $allowedCountriesReader + * @param SessionCleanerInterface|null $sessionCleaner * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveParameterList) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.LongVariable) + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function __construct( CustomerFactory $customerFactory, @@ -442,7 +449,8 @@ public function __construct( SearchCriteriaBuilder $searchCriteriaBuilder = null, AddressRegistry $addressRegistry = null, GetCustomerByToken $getByToken = null, - AllowedCountries $allowedCountriesReader = null + AllowedCountries $allowedCountriesReader = null, + SessionCleanerInterface $sessionCleaner = null ) { $this->customerFactory = $customerFactory; $this->eventManager = $eventManager; @@ -473,12 +481,6 @@ public function __construct( $this->dateTimeFactory = $dateTimeFactory ?: $objectManager->get(DateTimeFactory::class); $this->accountConfirmation = $accountConfirmation ?: $objectManager ->get(AccountConfirmation::class); - $this->sessionManager = $sessionManager - ?: $objectManager->get(SessionManagerInterface::class); - $this->saveHandler = $saveHandler - ?: $objectManager->get(SaveHandlerInterface::class); - $this->visitorCollectionFactory = $visitorCollectionFactory - ?: $objectManager->get(CollectionFactory::class); $this->searchCriteriaBuilder = $searchCriteriaBuilder ?: $objectManager->get(SearchCriteriaBuilder::class); $this->addressRegistry = $addressRegistry @@ -487,6 +489,7 @@ public function __construct( ?: $objectManager->get(GetCustomerByToken::class); $this->allowedCountriesReader = $allowedCountriesReader ?: $objectManager->get(AllowedCountries::class); + $this->sessionCleaner = $sessionCleaner ?? $objectManager->get(SessionCleanerInterface::class); } /** @@ -525,7 +528,11 @@ public function resendConfirmation($email, $websiteId = null, $redirectUrl = '') } catch (MailException $e) { // If we are not able to send a new account email, this should be ignored $this->logger->critical($e); + + return false; } + + return true; } /** @@ -673,7 +680,8 @@ private function handleUnknownTemplate($template) { throw new InputException( __( - 'Invalid value of "%value" provided for the %fieldName field. Possible values: %template1 or %template2.', + 'Invalid value of "%value" provided for the %fieldName field. ' + . 'Possible values: %template1 or %template2.', [ 'value' => $template, 'fieldName' => 'template', @@ -712,13 +720,7 @@ public function resetPassword($email, $resetToken, $newPassword) $customerSecure->setRpToken(null); $customerSecure->setRpTokenCreatedAt(null); $customerSecure->setPasswordHash($this->createPasswordHash($newPassword)); - $this->destroyCustomerSessions($customer->getId()); - if ($this->sessionManager->isSessionExists()) { - //delete old session and move data to the new session - //use this instead of $this->sessionManager->regenerateId because last one doesn't delete old session - // phpcs:ignore Magento2.Functions.DiscouragedFunction - session_regenerate_id(true); - } + $this->sessionCleaner->clearFor((int)$customer->getId()); $this->customerRepository->save($customer); return true; @@ -1047,7 +1049,7 @@ private function changePasswordForCustomer($customer, $currentPassword, $newPass $customerSecure->setRpTokenCreatedAt(null); $this->checkPasswordStrength($newPassword); $customerSecure->setPasswordHash($this->createPasswordHash($newPassword)); - $this->destroyCustomerSessions($customer->getId()); + $this->sessionCleaner->clearFor((int)$customer->getId()); $this->disableAddressValidation($customer); $this->customerRepository->save($customer); @@ -1600,36 +1602,6 @@ private function getEmailNotification() } } - /** - * Destroy all active customer sessions by customer id (current session will not be destroyed). - * - * Customer sessions which should be deleted are collecting from the "customer_visitor" table considering - * configured session lifetime. - * - * @param string|int $customerId - * @return void - */ - private function destroyCustomerSessions($customerId) - { - $sessionLifetime = $this->scopeConfig->getValue( - \Magento\Framework\Session\Config::XML_PATH_COOKIE_LIFETIME, - \Magento\Store\Model\ScopeInterface::SCOPE_STORE - ); - $dateTime = $this->dateTimeFactory->create(); - $activeSessionsTime = $dateTime->setTimestamp($dateTime->getTimestamp() - $sessionLifetime) - ->format(DateTime::DATETIME_PHP_FORMAT); - /** @var \Magento\Customer\Model\ResourceModel\Visitor\Collection $visitorCollection */ - $visitorCollection = $this->visitorCollectionFactory->create(); - $visitorCollection->addFieldToFilter('customer_id', $customerId); - $visitorCollection->addFieldToFilter('last_visit_at', ['from' => $activeSessionsTime]); - $visitorCollection->addFieldToFilter('session_id', ['neq' => $this->sessionManager->getSessionId()]); - /** @var \Magento\Customer\Model\Visitor $visitor */ - foreach ($visitorCollection->getItems() as $visitor) { - $sessionId = $visitor->getSessionId(); - $this->saveHandler->destroy($sessionId); - } - } - /** * Set ignore_validation_flag for reset password flow to skip unnecessary address and customer validation *
app/code/Magento/Customer/Model/Session/SessionCleaner.php+100 −0 added@@ -0,0 +1,100 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +declare(strict_types=1); + +namespace Magento\Customer\Model\Session; + +use Magento\Customer\Api\SessionCleanerInterface; +use Magento\Customer\Model\ResourceModel\Visitor\CollectionFactory as VisitorCollectionFactory; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\Intl\DateTimeFactory; +use Magento\Framework\Session\Config; +use Magento\Framework\Session\SaveHandlerInterface; +use Magento\Framework\Session\SessionManagerInterface; +use Magento\Framework\Stdlib\DateTime; +use Magento\Store\Model\ScopeInterface; + +/** + * Deletes all session data which relates to customer, including current session data. + * + * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) + */ +class SessionCleaner implements SessionCleanerInterface +{ + /** + * @var ScopeConfigInterface + */ + private $scopeConfig; + + /** + * @var DateTimeFactory + */ + private $dateTimeFactory; + + /** + * @var VisitorCollectionFactory + */ + private $visitorCollectionFactory; + + /** + * @var SessionManagerInterface + */ + private $sessionManager; + + /** + * @var SaveHandlerInterface + */ + private $saveHandler; + + /** + * @inheritdoc + */ + public function __construct( + ScopeConfigInterface $scopeConfig, + DateTimeFactory $dateTimeFactory, + VisitorCollectionFactory $visitorCollectionFactory, + SessionManagerInterface $sessionManager, + SaveHandlerInterface $saveHandler + ) { + $this->scopeConfig = $scopeConfig; + $this->dateTimeFactory = $dateTimeFactory; + $this->visitorCollectionFactory = $visitorCollectionFactory; + $this->sessionManager = $sessionManager; + $this->saveHandler = $saveHandler; + } + + /** + * @inheritdoc + */ + public function clearFor(int $customerId): void + { + if ($this->sessionManager->isSessionExists()) { + //delete old session and move data to the new session + //use this instead of $this->sessionManager->regenerateId because last one doesn't delete old session + // phpcs:ignore Magento2.Functions.DiscouragedFunction + session_regenerate_id(true); + } + + $sessionLifetime = $this->scopeConfig->getValue( + Config::XML_PATH_COOKIE_LIFETIME, + ScopeInterface::SCOPE_STORE + ); + $dateTime = $this->dateTimeFactory->create(); + $activeSessionsTime = $dateTime->setTimestamp($dateTime->getTimestamp() - $sessionLifetime) + ->format(DateTime::DATETIME_PHP_FORMAT); + /** @var \Magento\Customer\Model\ResourceModel\Visitor\Collection $visitorCollection */ + $visitorCollection = $this->visitorCollectionFactory->create(); + $visitorCollection->addFieldToFilter('customer_id', $customerId); + $visitorCollection->addFieldToFilter('last_visit_at', ['from' => $activeSessionsTime]); + /** @var \Magento\Customer\Model\Visitor $visitor */ + foreach ($visitorCollection->getItems() as $visitor) { + $sessionId = $visitor->getSessionId(); + $this->sessionManager->start(); + $this->saveHandler->destroy($sessionId); + $this->sessionManager->writeClose(); + } + } +}
app/code/Magento/Customer/Model/Visitor.php+21 −3 modified@@ -10,9 +10,8 @@ use Magento\Framework\App\RequestSafetyInterface; /** - * Class Visitor + * Class Visitor responsible for initializing visitor's. * - * @package Magento\Customer\Model * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) */ @@ -194,7 +193,9 @@ public function initByRequest($observer) public function saveByRequest($observer) { // prevent saving Visitor for safe methods, e.g. GET request - if ($this->skipRequestLogging || $this->requestSafety->isSafeMethod() || $this->isModuleIgnored($observer)) { + if (($this->skipRequestLogging || $this->requestSafety->isSafeMethod() || $this->isModuleIgnored($observer)) + && !$this->sessionIdHasChanged() + ) { return $this; } @@ -208,6 +209,23 @@ public function saveByRequest($observer) return $this; } + /** + * Check if visitor session id was changed. + * + * @return bool + */ + private function sessionIdHasChanged(): bool + { + $visitorData = $this->session->getVisitorData(); + $hasChanged = false; + + if (isset($visitorData['session_id'])) { + $hasChanged = $this->session->getSessionId() !== $visitorData['session_id']; + } + + return $hasChanged; + } + /** * Returns true if the module is required *
app/code/Magento/Customer/Test/Mftf/Data/AddressData.xml+1 −0 modified@@ -327,6 +327,7 @@ <data key="postcode">10789</data> <data key="telephone">333-33-333-33</data> <data key="country">Germany</data> + <data key="state">Berlin</data> </entity> <entity name="US_Address_California"> <data key="firstname">John</data>
app/code/Magento/Customer/Test/Mftf/Test/StorefrontClearAllCompareProductsTest.xml+4 −0 modified@@ -124,6 +124,10 @@ <deleteData createDataKey="createBundleProduct1" stepKey="deleteBundleProduct1"/> <deleteData createDataKey="createGroupedProduct1" stepKey="deleteGroupedProduct1"/> <deleteData createDataKey="createDownloadableProduct1" stepKey="deleteDownloadableProduct1"/> + <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <actionGroup ref="LoginToStorefrontActionGroup" stepKey="loginAsCustomer1">
app/code/Magento/Customer/Test/Mftf/Test/StorefrontUpdateCustomerPasswordTest.xml+14 −1 modified@@ -78,4 +78,17 @@ <remove keyForRemoval="loginWithNewPassword"/> <remove keyForRemoval="seeMyEmail"/> </test> -</tests> \ No newline at end of file + <test name="StorefrontUpdateCustomerPasswordRedirectOnLoginPage" extends="StorefrontUpdateCustomerPasswordValidCurrentPasswordTest"> + <annotations> + <title value="Update Customer Password on Storefront Redirect on Login Page"/> + <description value="Update Customer Password on Storefront Redirect on Login Page"/> + <testCaseId value="MC-22957"/> + <useCaseId value="MC-29461"/> + </annotations> + <remove keyForRemoval="logout"/> + <remove keyForRemoval="loginWithNewPassword"/> + <remove keyForRemoval="seeMyEmail"/> + + <seeInCurrentUrl url="{{StorefrontCustomerSignInPage.url}}" stepKey="assertStorefrontCustomerLoginPage"/> + </test> +</tests>
app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php+11 −43 modified@@ -7,6 +7,7 @@ namespace Magento\Customer\Test\Unit\Model; use Magento\Customer\Api\Data\CustomerInterface; +use Magento\Customer\Api\SessionCleanerInterface; use Magento\Customer\Model\AccountConfirmation; use Magento\Customer\Model\AccountManagement; use Magento\Customer\Model\AuthenticationInterface; @@ -161,6 +162,11 @@ class AccountManagementTest extends \PHPUnit\Framework\TestCase */ private $allowedCountriesReader; + /** + * @var SessionCleanerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $sessionCleanerMock; + /** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ @@ -1463,6 +1469,7 @@ private function reInitModel() ->setMethods(['create']) ->getMock(); $dateTimeFactory->expects($this->any())->method('create')->willReturn($dateTimeMock); + $this->sessionCleanerMock = $this->createMock(SessionCleanerInterface::class); $this->objectManagerHelper = new ObjectManagerHelper($this); $this->accountManagement = $this->objectManagerHelper->getObject( @@ -1483,6 +1490,7 @@ private function reInitModel() 'storeManager' => $this->storeManager, 'addressRegistry' => $this->addressRegistryMock, 'transportBuilder' => $this->transportBuilder, + 'sessionCleaner' => $this->sessionCleanerMock, ] ); $this->objectManagerHelper->setBackwardCompatibleProperty( @@ -1561,33 +1569,13 @@ public function testChangePassword() ->with($newPassword) ->willReturn(7); + $this->sessionCleanerMock->expects($this->once())->method('clearFor')->with($customerId)->willReturnSelf(); + $this->customerRepository ->expects($this->once()) ->method('save') ->with($customer); - $this->sessionManager->expects($this->atLeastOnce())->method('getSessionId'); - - $visitor = $this->getMockBuilder(\Magento\Customer\Model\Visitor::class) - ->disableOriginalConstructor() - ->setMethods(['getSessionId']) - ->getMock(); - $visitor->expects($this->atLeastOnce())->method('getSessionId') - ->willReturnOnConsecutiveCalls('session_id_1', 'session_id_2'); - $visitorCollection = $this->getMockBuilder( - \Magento\Customer\Model\ResourceModel\Visitor\CollectionFactory::class - ) - ->disableOriginalConstructor()->setMethods(['addFieldToFilter', 'getItems'])->getMock(); - $visitorCollection->expects($this->atLeastOnce())->method('addFieldToFilter')->willReturnSelf(); - $visitorCollection->expects($this->atLeastOnce())->method('getItems')->willReturn([$visitor, $visitor]); - $this->visitorCollectionFactory->expects($this->atLeastOnce())->method('create') - ->willReturn($visitorCollection); - $this->saveHandler->expects($this->atLeastOnce())->method('destroy') - ->withConsecutive( - ['session_id_1'], - ['session_id_2'] - ); - $this->assertTrue($this->accountManagement->changePassword($email, $currentPassword, $newPassword)); } @@ -1641,28 +1629,8 @@ function ($string) { $this->customerSecure->expects($this->once())->method('setRpToken')->with(null); $this->customerSecure->expects($this->once())->method('setRpTokenCreatedAt')->with(null); $this->customerSecure->expects($this->any())->method('setPasswordHash')->willReturn(null); + $this->sessionCleanerMock->expects($this->once())->method('clearFor')->with($customerId)->willReturnSelf(); - $this->sessionManager->method('isSessionExists')->willReturn(false); - $this->sessionManager->expects($this->atLeastOnce())->method('getSessionId'); - $visitor = $this->getMockBuilder(\Magento\Customer\Model\Visitor::class) - ->disableOriginalConstructor() - ->setMethods(['getSessionId']) - ->getMock(); - $visitor->expects($this->atLeastOnce())->method('getSessionId') - ->willReturnOnConsecutiveCalls('session_id_1', 'session_id_2'); - $visitorCollection = $this->getMockBuilder( - \Magento\Customer\Model\ResourceModel\Visitor\CollectionFactory::class - ) - ->disableOriginalConstructor()->setMethods(['addFieldToFilter', 'getItems'])->getMock(); - $visitorCollection->expects($this->atLeastOnce())->method('addFieldToFilter')->willReturnSelf(); - $visitorCollection->expects($this->atLeastOnce())->method('getItems')->willReturn([$visitor, $visitor]); - $this->visitorCollectionFactory->expects($this->atLeastOnce())->method('create') - ->willReturn($visitorCollection); - $this->saveHandler->expects($this->atLeastOnce())->method('destroy') - ->withConsecutive( - ['session_id_1'], - ['session_id_2'] - ); $this->assertTrue($this->accountManagement->resetPassword($customerEmail, $resetToken, $newPassword)); }
app/code/Magento/Deploy/composer.json+7 −6 modified@@ -6,11 +6,11 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-config": "*", - "magento/module-require-js": "*", - "magento/module-store": "*", - "magento/module-user": "*" + "magento/framework": "102.0.*", + "magento/module-config": "101.1.*", + "magento/module-require-js": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-user": "101.1.*" }, "type": "magento2-module", "license": [ @@ -25,5 +25,6 @@ "psr-4": { "Magento\\Deploy\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Developer/composer.json+5 −4 modified@@ -6,9 +6,9 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-config": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-config": "101.1.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -22,5 +22,6 @@ "psr-4": { "Magento\\Developer\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Dhl/composer.json+13 −12 modified@@ -7,19 +7,19 @@ "require": { "php": "~7.1.3||~7.2.0||~7.3.0", "lib-libxml": "*", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-config": "*", - "magento/module-directory": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-shipping": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-config": "101.1.*", + "magento/module-directory": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-shipping": "100.3.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-checkout": "*" + "magento/module-checkout": "100.3.*" }, "type": "magento2-module", "license": [ @@ -33,5 +33,6 @@ "psr-4": { "Magento\\Dhl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Directory/Block/Data.php+1 −1 modified@@ -142,7 +142,7 @@ public function getCountryHtmlSelect($defValue = null, $name = 'country_id', $id )->setId( $id )->setTitle( - $this->escapeHtml(__($title)) + $this->escapeHtmlAttr(__($title)) )->setValue( $defValue )->setOptions(
app/code/Magento/Directory/composer.json+6 −5 modified@@ -7,10 +7,10 @@ "require": { "php": "~7.1.3||~7.2.0||~7.3.0", "lib-libxml": "*", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-config": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-config": "101.1.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -24,5 +24,6 @@ "psr-4": { "Magento\\Directory\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/DirectoryGraphQl/composer.json+22 −21 modified@@ -1,24 +1,25 @@ { - "name": "magento/module-directory-graph-ql", - "description": "N/A", - "type": "magento2-module", - "require": { - "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-directory": "*", - "magento/module-store": "*", - "magento/module-graph-ql": "*", - "magento/framework": "*" - }, - "license": [ - "OSL-3.0", - "AFL-3.0" - ], - "autoload": { - "files": [ - "registration.php" + "name": "magento/module-directory-graph-ql", + "description": "N/A", + "type": "magento2-module", + "require": { + "php": "~7.1.3||~7.2.0||~7.3.0", + "magento/module-directory": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-graph-ql": "100.3.*", + "magento/framework": "102.0.*" + }, + "license": [ + "OSL-3.0", + "AFL-3.0" ], - "psr-4": { - "Magento\\DirectoryGraphQl\\": "" - } - } + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\DirectoryGraphQl\\": "" + } + }, + "version": "100.3.3" }
app/code/Magento/Directory/Test/Unit/Block/DataTest.php+10 −2 modified@@ -65,7 +65,11 @@ class DataTest extends \PHPUnit\Framework\TestCase protected function setUp() { $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->escaper= $objectManagerHelper->getObject(Escaper::class); + $this->escaper = $this->getMockBuilder(Escaper::class) + ->disableOriginalConstructor() + ->setMethods(['escapeHtmlAttr']) + ->getMock(); + $this->prepareContext(); $this->helperDataMock = $this->getMockBuilder(\Magento\Directory\Helper\Data::class) @@ -304,7 +308,7 @@ protected function mockElementHtmlSelect($defaultCountry, $options, $resultHtml) 'setValue', 'setOptions', 'setExtraParams', - 'getHtml', + 'getHtml' ] ) ->getMock(); @@ -336,6 +340,10 @@ protected function mockElementHtmlSelect($defaultCountry, $options, $resultHtml) $elementHtmlSelect->expects($this->once()) ->method('getHtml') ->willReturn($resultHtml); + $this->escaper->expects($this->once()) + ->method('escapeHtmlAttr') + ->with(__($title)) + ->willReturn(__($title)); return $elementHtmlSelect; }
app/code/Magento/Downloadable/composer.json+20 −19 modified@@ -6,26 +6,26 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-checkout": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-directory": "*", - "magento/module-eav": "*", - "magento/module-gift-message": "*", - "magento/module-media-storage": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-store": "*", - "magento/module-tax": "*", - "magento/module-theme": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-checkout": "100.3.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-gift-message": "100.3.*", + "magento/module-media-storage": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*", + "magento/module-theme": "101.0.*", + "magento/module-ui": "101.1.*" }, "suggest": { - "magento/module-downloadable-sample-data": "*" + "magento/module-downloadable-sample-data": "Sample Data version: 100.3.*" }, "type": "magento2-module", "license": [ @@ -39,5 +39,6 @@ "psr-4": { "Magento\\Downloadable\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/DownloadableGraphQl/composer.json+8 −7 modified@@ -4,14 +4,14 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-catalog": "*", - "magento/module-downloadable": "*", - "magento/module-quote": "*", - "magento/module-quote-graph-ql": "*", - "magento/framework": "*" + "magento/module-catalog": "103.0.*", + "magento/module-downloadable": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-quote-graph-ql": "100.3.*", + "magento/framework": "102.0.*" }, "suggest": { - "magento/module-catalog-graph-ql": "*" + "magento/module-catalog-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -24,5 +24,6 @@ "psr-4": { "Magento\\DownloadableGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/DownloadableImportExport/composer.json+9 −8 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-catalog-import-export": "*", - "magento/module-downloadable": "*", - "magento/module-eav": "*", - "magento/module-import-export": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-import-export": "101.0.*", + "magento/module-downloadable": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-import-export": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\DownloadableImportExport\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Eav/composer.json+8 −7 modified@@ -6,12 +6,12 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-config": "*", - "magento/module-media-storage": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-config": "101.1.*", + "magento/module-media-storage": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -25,5 +25,6 @@ "psr-4": { "Magento\\Eav\\": "" } - } + }, + "version": "102.0.4-p2" }
app/code/Magento/EavGraphQl/composer.json+5 −4 modified@@ -4,11 +4,11 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-eav": "*" + "magento/framework": "102.0.*", + "magento/module-eav": "102.0.*" }, "suggest": { - "magento/module-graph-ql": "*" + "magento/module-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -21,5 +21,6 @@ "psr-4": { "Magento\\EavGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Eav/Model/Entity/Attribute.php+19 −0 modified@@ -260,6 +260,8 @@ public function beforeSave() ); } + $this->validateEntityType(); + $defaultValue = $this->getDefaultValue(); $hasDefaultValue = (string)$defaultValue != ''; @@ -512,4 +514,21 @@ public function __wakeup() $this->reservedAttributeList = $objectManager->get(\Magento\Catalog\Model\Product\ReservedAttributeList::class); $this->dateTimeFormatter = $objectManager->get(DateTimeFormatterInterface::class); } + + /** + * Entity type for existing attribute shouldn't be changed. + * + * @return void + * @throws LocalizedException + */ + private function validateEntityType(): void + { + if ($this->getId() !== null) { + $origEntityTypeId = $this->getOrigData('entity_type_id'); + + if (($origEntityTypeId !== null) && ((int)$this->getEntityTypeId() !== (int)$origEntityTypeId)) { + throw new LocalizedException(__('Do not change entity type.')); + } + } + } }
app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute.php+2 −1 modified@@ -107,6 +107,7 @@ public function loadByCode(AbstractModel $object, $entityTypeId, $code) if ($data) { $object->setData($data); + $object->setOrigData('entity_type_id', $object->getEntityTypeId()); $this->_afterLoad($object); return true; } @@ -197,7 +198,7 @@ protected function _beforeSave(AbstractModel $object) * @param AbstractModel $attribute * @return AbstractDb * @throws CouldNotDeleteException - * @since 102.0.3 + * @since 102.0.2 */ protected function _beforeDelete(AbstractModel $attribute) {
app/code/Magento/Elasticsearch6/composer.json+9 −8 modified@@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-advanced-search": "*", - "magento/module-catalog-search": "*", - "magento/module-search": "*", - "magento/module-store": "*", - "magento/module-elasticsearch": "*", + "magento/framework": "102.0.*", + "magento/module-advanced-search": "100.3.*", + "magento/module-catalog-search": "101.0.*", + "magento/module-search": "101.0.*", + "magento/module-store": "101.0.*", + "magento/module-elasticsearch": "100.3.*", "elasticsearch/elasticsearch": "~2.0|~5.1|~6.1" }, "suggest": { - "magento/module-config": "*" + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\Elasticsearch6\\": "" } - } + }, + "version": "100.3.3" }
app/code/Magento/Elasticsearch/composer.json+12 −11 modified@@ -3,19 +3,19 @@ "description": "N/A", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-advanced-search": "*", - "magento/module-catalog": "*", - "magento/module-catalog-search": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-search": "*", - "magento/module-store": "*", - "magento/module-catalog-inventory": "*", - "magento/framework": "*", + "magento/module-advanced-search": "100.3.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-search": "101.0.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-search": "101.0.*", + "magento/module-store": "101.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/framework": "102.0.*", "elasticsearch/elasticsearch": "~2.0|~5.1|~6.1" }, "suggest": { - "magento/module-config": "*" + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -29,5 +29,6 @@ "psr-4": { "Magento\\Elasticsearch\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Email/composer.json+11 −10 modified@@ -6,17 +6,17 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-cms": "*", - "magento/module-config": "*", - "magento/module-store": "*", - "magento/module-theme": "*", - "magento/module-media-storage": "*", - "magento/module-variable": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-cms": "103.0.*", + "magento/module-config": "101.1.*", + "magento/module-store": "101.0.*", + "magento/module-theme": "101.0.*", + "magento/module-media-storage": "100.3.*", + "magento/module-variable": "100.3.*" }, "suggest": { - "magento/module-theme": "*" + "magento/module-theme": "101.0.*" }, "type": "magento2-module", "license": [ @@ -30,5 +30,6 @@ "psr-4": { "Magento\\Email\\": "" } - } + }, + "version": "101.0.4-p2" }
app/code/Magento/Email/Model/Template/Filter.php+44 −7 modified@@ -6,8 +6,9 @@ namespace Magento\Email\Model\Template; use Magento\Framework\App\ObjectManager; +use Magento\Framework\Exception\MailException; +use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Filesystem; -use Magento\Framework\Filesystem\Directory\ReadInterface; use Magento\Framework\Filter\VariableResolverInterface; use Magento\Framework\View\Asset\ContentProcessorException; use Magento\Framework\View\Asset\ContentProcessorInterface; @@ -51,7 +52,7 @@ class Filter extends \Magento\Framework\Filter\Template * Modifier Callbacks * * @var array - * @deprecated Use the new Directive Processor interfaces + * @deprecated 101.0.4 Use the new Directive Processor interfaces */ protected $_modifiers = ['nl2br' => '']; @@ -665,7 +666,7 @@ public function varDirective($construction) * @param string $value * @param string $default assumed modifier if none present * @return array - * @deprecated Use the new FilterApplier or Directive Processor interfaces + * @deprecated 101.0.4 Use the new FilterApplier or Directive Processor interfaces */ protected function explodeModifiers($value, $default = null) { @@ -684,7 +685,7 @@ protected function explodeModifiers($value, $default = null) * @param string $value * @param string $modifiers * @return string - * @deprecated Use the new FilterApplier or Directive Processor interfaces + * @deprecated 101.0.4 Use the new FilterApplier or Directive Processor interfaces */ protected function applyModifiers($value, $modifiers) { @@ -712,7 +713,7 @@ protected function applyModifiers($value, $modifiers) * @param string $value * @param string $type * @return string - * @deprecated Use the new FilterApplier or Directive Processor interfaces + * @deprecated 101.0.4 Use the new FilterApplier or Directive Processor interfaces */ public function modifierEscape($value, $type = 'html') { @@ -740,27 +741,32 @@ public function modifierEscape($value, $type = 'html') * {{protocol store="1"}} - Optional parameter which gets protocol from provide store based on store ID or code * * @param string[] $construction - * @throws \Magento\Framework\Exception\MailException * @return string + * @throws MailException + * @throws NoSuchEntityException */ public function protocolDirective($construction) { $params = $this->getParameters($construction[2]); + $store = null; if (isset($params['store'])) { try { $store = $this->_storeManager->getStore($params['store']); } catch (\Exception $e) { - throw new \Magento\Framework\Exception\MailException( + throw new MailException( __('Requested invalid store "%1"', $params['store']) ); } } + $isSecure = $this->_storeManager->getStore($store)->isCurrentlySecure(); $protocol = $isSecure ? 'https' : 'http'; if (isset($params['url'])) { return $protocol . '://' . $params['url']; } elseif (isset($params['http']) && isset($params['https'])) { + $this->validateProtocolDirectiveHttpScheme($params); + if ($isSecure) { return $params['https']; } @@ -770,6 +776,37 @@ public function protocolDirective($construction) return $protocol; } + /** + * Validate protocol directive HTTP parameters. + * + * @param string[] $params + * @return void + * @throws MailException + */ + private function validateProtocolDirectiveHttpScheme(array $params) : void + { + $parsed_http = parse_url($params['http']); + $parsed_https = parse_url($params['https']); + + if (empty($parsed_http)) { + throw new MailException( + __('Contents of %1 could not be loaded or is empty', $params['http']) + ); + } elseif (empty($parsed_https)) { + throw new MailException( + __('Contents of %1 could not be loaded or is empty', $params['https']) + ); + } elseif ($parsed_http['scheme'] !== 'http') { + throw new MailException( + __('Contents of %1 could not be loaded or is empty', $params['http']) + ); + } elseif ($parsed_https['scheme'] !== 'https') { + throw new MailException( + __('Contents of %1 could not be loaded or is empty', $params['https']) + ); + } + } + /** * Store config directive *
app/code/Magento/Email/Test/Unit/Model/Template/FilterTest.php+40 −0 modified@@ -10,6 +10,8 @@ use Magento\Framework\App\Area; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem\Directory\ReadInterface; +use Magento\Framework\Exception\MailException; +use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\View\Asset\File\FallbackContext; /** @@ -402,4 +404,42 @@ public function testConfigDirectiveUnavailable() $this->assertEquals($scopeConfigValue, $this->getModel()->configDirective($construction)); } + + /** + * @throws MailException + * @throws NoSuchEntityException + */ + public function testProtocolDirectiveWithValidSchema() + { + $model = $this->getModel(); + $storeMock = $this->createMock(\Magento\Store\Model\Store::class); + $storeMock->expects($this->once())->method('isCurrentlySecure')->willReturn(true); + $this->storeManager->expects($this->once())->method('getStore')->willReturn($storeMock); + + $data = [ + "{{protocol http=\"http://url\" https=\"https://url\"}}", + "protocol", + " http=\"http://url\" https=\"https://url\"" + ]; + $this->assertEquals('https://url', $model->protocolDirective($data)); + } + + /** + * @expectedException \Magento\Framework\Exception\MailException + * @throws NoSuchEntityException + */ + public function testProtocolDirectiveWithInvalidSchema() + { + $model = $this->getModel(); + $storeMock = $this->createMock(\Magento\Store\Model\Store::class); + $storeMock->expects($this->once())->method('isCurrentlySecure')->willReturn(true); + $this->storeManager->expects($this->once())->method('getStore')->willReturn($storeMock); + + $data = [ + "{{protocol http=\"https://url\" https=\"http://url\"}}", + "protocol", + " http=\"https://url\" https=\"http://url\"" + ]; + $model->protocolDirective($data); + } }
app/code/Magento/EncryptionKey/composer.json+5 −4 modified@@ -6,9 +6,9 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-config": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -22,5 +22,6 @@ "psr-4": { "Magento\\EncryptionKey\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Fedex/composer.json+11 −10 modified@@ -7,15 +7,15 @@ "require": { "php": "~7.1.3||~7.2.0||~7.3.0", "lib-libxml": "*", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-config": "*", - "magento/module-directory": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-shipping": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-config": "101.1.*", + "magento/module-directory": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-shipping": "100.3.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -29,5 +29,6 @@ "psr-4": { "Magento\\Fedex\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/GiftMessage/composer.json+13 −12 modified@@ -6,19 +6,19 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-checkout": "*", - "magento/module-customer": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-store": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-ui": "101.1.*" }, "suggest": { - "magento/module-eav": "*", - "magento/module-multishipping": "*" + "magento/module-eav": "102.0.*", + "magento/module-multishipping": "100.3.*" }, "type": "magento2-module", "license": [ @@ -32,5 +32,6 @@ "psr-4": { "Magento\\GiftMessage\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/GoogleAdwords/composer.json+5 −4 modified@@ -6,9 +6,9 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-sales": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -22,5 +22,6 @@ "psr-4": { "Magento\\GoogleAdwords\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/GoogleAnalytics/composer.json+7 −6 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-cookie": "*", - "magento/module-sales": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-cookie": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-config": "*" + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\GoogleAnalytics\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/GoogleOptimizer/composer.json+9 −8 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-cms": "*", - "magento/module-google-analytics": "*", - "magento/module-store": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-cms": "103.0.*", + "magento/module-google-analytics": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-ui": "101.1.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\GoogleOptimizer\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/GraphQlCache/composer.json+5 −4 modified@@ -4,9 +4,9 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-page-cache": "*", - "magento/module-graph-ql": "*" + "magento/framework": "102.0.*", + "magento/module-page-cache": "100.3.*", + "magento/module-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -19,5 +19,6 @@ "psr-4": { "Magento\\GraphQlCache\\": "" } - } + }, + "version": "100.3.2" }
app/code/Magento/GraphQl/composer.json+6 −5 modified@@ -4,12 +4,12 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-eav": "*", - "magento/framework": "*" + "magento/module-eav": "102.0.*", + "magento/framework": "102.0.*" }, "suggest": { - "magento/module-webapi": "*", - "magento/module-graph-ql-cache": "*" + "magento/module-webapi": "100.3.*", + "magento/module-graph-ql-cache": "100.3.*" }, "license": [ "OSL-3.0", @@ -22,5 +22,6 @@ "psr-4": { "Magento\\GraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/GroupedCatalogInventory/composer.json+6 −5 modified@@ -6,10 +6,10 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-grouped-product": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-grouped-product": "100.3.*" }, "type": "magento2-module", "license": [ @@ -23,5 +23,6 @@ "psr-4": { "Magento\\GroupedCatalogInventory\\": "" } - } + }, + "version": "100.3.3" }
app/code/Magento/GroupedImportExport/composer.json+8 −7 modified@@ -6,12 +6,12 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-catalog-import-export": "*", - "magento/module-eav": "*", - "magento/module-grouped-product": "*", - "magento/module-import-export": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-import-export": "101.0.*", + "magento/module-eav": "102.0.*", + "magento/module-grouped-product": "100.3.*", + "magento/module-import-export": "100.3.*" }, "type": "magento2-module", "license": [ @@ -25,5 +25,6 @@ "psr-4": { "Magento\\GroupedImportExport\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/GroupedProduct/composer.json+16 −15 modified@@ -6,22 +6,22 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-checkout": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-media-storage": "*", - "magento/module-msrp": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-store": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-checkout": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-media-storage": "100.3.*", + "magento/module-msrp": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-ui": "101.1.*" }, "suggest": { - "magento/module-grouped-product-sample-data": "*" + "magento/module-grouped-product-sample-data": "Sample Data version: 100.3.*" }, "type": "magento2-module", "license": [ @@ -35,5 +35,6 @@ "psr-4": { "Magento\\GroupedProduct\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/GroupedProductGraphQl/composer.json+6 −5 modified@@ -4,10 +4,10 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-grouped-product": "*", - "magento/module-catalog": "*", - "magento/module-catalog-graph-ql": "*", - "magento/framework": "*" + "magento/module-grouped-product": "100.3.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-graph-ql": "100.3.*", + "magento/framework": "102.0.*" }, "license": [ "OSL-3.0", @@ -20,5 +20,6 @@ "psr-4": { "Magento\\GroupedProductGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/ImportExport/composer.json+9 −8 modified@@ -7,13 +7,13 @@ "require": { "php": "~7.1.3||~7.2.0||~7.3.0", "ext-ctype": "*", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-eav": "*", - "magento/module-media-storage": "*", - "magento/module-store": "*", - "magento/module-ui": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-eav": "102.0.*", + "magento/module-media-storage": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-ui": "101.1.*" }, "type": "magento2-module", "license": [ @@ -27,5 +27,6 @@ "psr-4": { "Magento\\ImportExport\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckThatSomeAttributesChangedValueToEmptyAfterImportTest.xml+3 −0 modified@@ -42,6 +42,9 @@ <!--Delete attribute--> <deleteData createDataKey="productAttribute" stepKey="deleteProductAttribute"/> <actionGroup ref="logout" stepKey="logoutFromAdmin"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!--Create product--> <actionGroup ref="GoToSpecifiedCreateProductPage" stepKey="openProductFillForm"/>
app/code/Magento/Indexer/composer.json+4 −3 modified@@ -6,8 +6,8 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*" }, "type": "magento2-module", "license": [ @@ -21,5 +21,6 @@ "psr-4": { "Magento\\Indexer\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/Indexer/Test/Mftf/ActionGroup/CliRunReindexUsingCronJobsActionGroup.xml+18 −0 added@@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="CliRunReindexUsingCronJobsActionGroup"> + <annotations> + <description>Run cron 'index' group which reindex all invalidated indices.</description> + </annotations> + + <magentoCLI command="cron:run" arguments="--group='index'" stepKey="firstRunToScheduleJobs"/> + <magentoCLI command="cron:run" arguments="--group='index'" stepKey="secondRunToExecuteJobs"/> + </actionGroup> +</actionGroups>
app/code/Magento/InstantPurchase/composer.json+26 −25 modified@@ -1,28 +1,29 @@ { - "name": "magento/module-instant-purchase", - "description": "N/A", - "type": "magento2-module", - "license": [ - "OSL-3.0", - "AFL-3.0" - ], - "require": { - "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-store": "*", - "magento/module-catalog": "*", - "magento/module-customer": "*", - "magento/module-sales": "*", - "magento/module-shipping": "*", - "magento/module-quote": "*", - "magento/module-vault": "*", - "magento/framework": "*" - }, - "autoload": { - "files": [ - "registration.php" + "name": "magento/module-instant-purchase", + "description": "N/A", + "type": "magento2-module", + "license": [ + "OSL-3.0", + "AFL-3.0" ], - "psr-4": { - "Magento\\InstantPurchase\\": "" - } - } + "require": { + "php": "~7.1.3||~7.2.0||~7.3.0", + "magento/module-store": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-customer": "102.0.*", + "magento/module-sales": "102.0.*", + "magento/module-shipping": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-vault": "101.1.*", + "magento/framework": "102.0.*" + }, + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InstantPurchase\\": "" + } + }, + "version": "100.3.4" }
app/code/Magento/Integration/composer.json+9 −8 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-authorization": "*", - "magento/module-backend": "*", - "magento/module-customer": "*", - "magento/module-security": "*", - "magento/module-store": "*", - "magento/module-user": "*" + "magento/framework": "102.0.*", + "magento/module-authorization": "100.3.*", + "magento/module-backend": "101.0.*", + "magento/module-customer": "102.0.*", + "magento/module-security": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-user": "101.1.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\Integration\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/LayeredNavigation/Block/Navigation.php+1 −0 modified@@ -76,6 +76,7 @@ protected function _prepareLayout() /** * @inheritdoc + * @since 100.3.4 */ protected function _beforeToHtml() {
app/code/Magento/LayeredNavigation/composer.json+5 −4 modified@@ -6,9 +6,9 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-config": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -22,5 +22,6 @@ "psr-4": { "Magento\\LayeredNavigation\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Marketplace/composer.json+4 −3 modified@@ -6,8 +6,8 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*" }, "type": "magento2-module", "license": [ @@ -21,5 +21,6 @@ "psr-4": { "Magento\\Marketplace\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/MediaGalleryApi/composer.json+3 −2 modified@@ -3,7 +3,7 @@ "description": "Magento module responsible for media gallery asset attributes storage and management", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*" + "magento/framework": "102.0.*" }, "type": "magento2-module", "license": [ @@ -17,5 +17,6 @@ "psr-4": { "Magento\\MediaGalleryApi\\": "" } - } + }, + "version": "100.3.0" }
app/code/Magento/MediaGallery/composer.json+6 −5 modified@@ -3,10 +3,10 @@ "description": "Magento module responsible for media handling", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-media-gallery-api": "*", - "magento/module-cms": "*", - "magento/module-catalog": "*" + "magento/framework": "102.0.*", + "magento/module-media-gallery-api": "100.3.*", + "magento/module-cms": "103.0.*", + "magento/module-catalog": "103.0.*" }, "type": "magento2-module", "license": [ @@ -20,5 +20,6 @@ "psr-4": { "Magento\\MediaGallery\\": "" } - } + }, + "version": "100.3.0-p2" }
app/code/Magento/MediaStorage/composer.json+8 −7 modified@@ -6,12 +6,12 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-config": "*", - "magento/module-store": "*", - "magento/module-catalog": "*", - "magento/module-theme": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-config": "101.1.*", + "magento/module-store": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-theme": "101.0.*" }, "type": "magento2-module", "license": [ @@ -25,5 +25,6 @@ "psr-4": { "Magento\\MediaStorage\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/MessageQueue/composer.json+3 −2 modified@@ -5,7 +5,7 @@ "sort-packages": true }, "require": { - "magento/framework": "*", + "magento/framework": "102.0.*", "magento/magento-composer-installer": "*", "php": "~7.1.3||~7.2.0||~7.3.0" }, @@ -21,5 +21,6 @@ "psr-4": { "Magento\\MessageQueue\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/Msrp/composer.json+10 −9 modified@@ -6,16 +6,16 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-downloadable": "*", - "magento/module-eav": "*", - "magento/module-store": "*", - "magento/module-tax": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-downloadable": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*" }, "suggest": { - "magento/module-bundle": "*", - "magento/module-msrp-sample-data": "*" + "magento/module-bundle": "100.3.*", + "magento/module-msrp-sample-data": "Sample Data version: 100.3.*" }, "type": "magento2-module", "license": [ @@ -29,5 +29,6 @@ "psr-4": { "Magento\\Msrp\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/MsrpConfigurableProduct/composer.json+6 −5 modified@@ -6,10 +6,10 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-msrp": "*", - "magento/module-configurable-product": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-msrp": "100.3.*", + "magento/module-configurable-product": "100.3.*" }, "type": "magento2-module", "license": [ @@ -23,5 +23,6 @@ "psr-4": { "Magento\\MsrpConfigurableProduct\\": "" } - } + }, + "version": "100.3.3" }
app/code/Magento/MsrpGroupedProduct/composer.json+6 −5 modified@@ -6,10 +6,10 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-catalog": "*", - "magento/module-msrp": "*", - "magento/module-grouped-product": "*" + "magento/framework": "102.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-msrp": "100.3.*", + "magento/module-grouped-product": "100.3.*" }, "type": "magento2-module", "license": [ @@ -23,5 +23,6 @@ "psr-4": { "Magento\\MsrpGroupedProduct\\": "" } - } + }, + "version": "100.3.3" }
app/code/Magento/Msrp/Test/Mftf/Test/StorefrontProductWithMapAssignedConfigProductIsCorrectTest.xml+3 −0 modified@@ -105,6 +105,9 @@ <createData entity="MsrpDisableMAP" stepKey="disableMAP"/> <actionGroup ref="logout" stepKey="logoutOfAdmin"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Set Manufacturer's Suggested Retail Price to products-->
app/code/Magento/Multishipping/composer.json+12 −11 modified@@ -6,16 +6,16 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-checkout": "*", - "magento/module-customer": "*", - "magento/module-directory": "*", - "magento/module-payment": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-store": "*", - "magento/module-tax": "*", - "magento/module-theme": "*" + "magento/framework": "102.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-payment": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*", + "magento/module-theme": "101.0.*" }, "type": "magento2-module", "license": [ @@ -29,5 +29,6 @@ "psr-4": { "Magento\\Multishipping\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/MysqlMq/composer.json+4 −3 modified@@ -5,9 +5,9 @@ "sort-packages": true }, "require": { - "magento/framework": "*", + "magento/framework": "102.0.*", "magento/magento-composer-installer": "*", - "magento/module-store": "*", + "magento/module-store": "101.0.*", "php": "~7.1.3||~7.2.0||~7.3.0" }, "type": "magento2-module", @@ -22,5 +22,6 @@ "psr-4": { "Magento\\MysqlMq\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/NewRelicReporting/composer.json+9 −8 modified@@ -6,14 +6,14 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", + "magento/framework": "102.0.*", "magento/magento-composer-installer": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-config": "*", - "magento/module-configurable-product": "*", - "magento/module-customer": "*", - "magento/module-store": "*" + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-config": "101.1.*", + "magento/module-configurable-product": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -27,5 +27,6 @@ "psr-4": { "Magento\\NewRelicReporting\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/Newsletter/Block/Adminhtml/Queue/Preview.php+5 −1 modified@@ -26,8 +26,8 @@ class Preview extends \Magento\Newsletter\Block\Adminhtml\Template\Preview /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Newsletter\Model\TemplateFactory $templateFactory - * @param \Magento\Newsletter\Model\QueueFactory $queueFactory * @param \Magento\Newsletter\Model\SubscriberFactory $subscriberFactory + * @param \Magento\Newsletter\Model\QueueFactory $queueFactory * @param array $data */ public function __construct( @@ -42,6 +42,8 @@ public function __construct( } /** + * Load newsletter email template. + * * @param \Magento\Newsletter\Model\Template $template * @param string $id * @return $this @@ -50,9 +52,11 @@ protected function loadTemplate(\Magento\Newsletter\Model\Template $template, $i { /** @var \Magento\Newsletter\Model\Queue $queue */ $queue = $this->_queueFactory->create()->load($id); + $template->setId($queue->getTemplateId()); $template->setTemplateType($queue->getNewsletterType()); $template->setTemplateText($queue->getNewsletterText()); $template->setTemplateStyles($queue->getNewsletterStyles()); + return $this; } }
app/code/Magento/Newsletter/composer.json+11 −10 modified@@ -6,15 +6,15 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-cms": "*", - "magento/module-customer": "*", - "magento/module-eav": "*", - "magento/module-email": "*", - "magento/module-require-js": "*", - "magento/module-store": "*", - "magento/module-widget": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-cms": "103.0.*", + "magento/module-customer": "102.0.*", + "magento/module-eav": "102.0.*", + "magento/module-email": "101.0.*", + "magento/module-require-js": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-widget": "101.1.*" }, "type": "magento2-module", "license": [ @@ -28,5 +28,6 @@ "psr-4": { "Magento\\Newsletter\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/Newsletter/Test/Unit/Block/Adminhtml/Queue/PreviewTest.php+50 −22 modified@@ -49,18 +49,18 @@ protected function setUp() { $context = $this->createMock(\Magento\Backend\Block\Template\Context::class); $eventManager = $this->createMock(\Magento\Framework\Event\ManagerInterface::class); - $context->expects($this->once())->method('getEventManager')->will($this->returnValue($eventManager)); + $context->expects($this->once())->method('getEventManager')->willReturn($eventManager); $scopeConfig = $this->createMock(\Magento\Framework\App\Config\ScopeConfigInterface::class); - $context->expects($this->once())->method('getScopeConfig')->will($this->returnValue($scopeConfig)); + $context->expects($this->once())->method('getScopeConfig')->willReturn($scopeConfig); $this->request = $this->createMock(\Magento\Framework\App\Request\Http::class); - $context->expects($this->once())->method('getRequest')->will($this->returnValue($this->request)); + $context->expects($this->once())->method('getRequest')->willReturn($this->request); $this->storeManager = $this->createPartialMock( \Magento\Store\Model\StoreManager::class, ['getStores', 'getDefaultStoreView'] ); - $context->expects($this->once())->method('getStoreManager')->will($this->returnValue($this->storeManager)); + $context->expects($this->once())->method('getStoreManager')->willReturn($this->storeManager); $appState = $this->createMock(\Magento\Framework\App\State::class); - $context->expects($this->once())->method('getAppState')->will($this->returnValue($appState)); + $context->expects($this->once())->method('getAppState')->willReturn($appState); $backendSession = $this->getMockBuilder(\Magento\Backend\Model\Session::class) ->disableOriginalConstructor() @@ -69,16 +69,34 @@ protected function setUp() $context->expects($this->once())->method('getBackendSession')->willReturn($backendSession); $templateFactory = $this->createPartialMock(\Magento\Newsletter\Model\TemplateFactory::class, ['create']); - $this->template = $this->createMock(\Magento\Newsletter\Model\Template::class); - $templateFactory->expects($this->once())->method('create')->will($this->returnValue($this->template)); + $this->template = $this->createPartialMock( + \Magento\Newsletter\Model\Template::class, + [ + 'isPlain', + 'setId', + 'setTemplateType', + 'setTemplateText', + 'setTemplateStyles', + ] + ); + $templateFactory->expects($this->once())->method('create')->willReturn($this->template); $subscriberFactory = $this->createPartialMock(\Magento\Newsletter\Model\SubscriberFactory::class, ['create']); $this->subscriber = $this->createMock(\Magento\Newsletter\Model\Subscriber::class); - $subscriberFactory->expects($this->once())->method('create')->will($this->returnValue($this->subscriber)); + $subscriberFactory->expects($this->once())->method('create')->willReturn($this->subscriber); $queueFactory = $this->createPartialMock(\Magento\Newsletter\Model\QueueFactory::class, ['create']); - $this->queue = $this->createPartialMock(\Magento\Newsletter\Model\Queue::class, ['load']); - $queueFactory->expects($this->any())->method('create')->will($this->returnValue($this->queue)); + $this->queue = $this->createPartialMock( + \Magento\Newsletter\Model\Queue::class, + [ + 'load', + 'getTemplateId', + 'getNewsletterType', + 'getNewsletterText', + 'getNewsletterStyles', + ] + ); + $queueFactory->expects($this->any())->method('create')->willReturn($this->queue); $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -100,27 +118,37 @@ public function testToHtmlEmpty() { /** @var \Magento\Store\Model\Store $store */ $store = $this->createPartialMock(\Magento\Store\Model\Store::class, ['getId']); - $this->storeManager->expects($this->once())->method('getDefaultStoreView')->will($this->returnValue($store)); + $this->storeManager->expects($this->once())->method('getDefaultStoreView')->willReturn($store); $result = $this->preview->toHtml(); $this->assertEquals('', $result); } public function testToHtmlWithId() { - $this->request->expects($this->any())->method('getParam')->will( - $this->returnValueMap( - [ - ['id', null, 1], - ['store_id', null, 0] - ] - ) + $templateId = 1; + $newsletterType = 2; + $newsletterText = 'newsletter text'; + $newsletterStyle = 'style'; + $this->request->expects($this->any())->method('getParam')->willReturnMap( + [ + ['id', null, 1], + ['store_id', null, 0], + ] ); - $this->queue->expects($this->once())->method('load')->will($this->returnSelf()); - $this->template->expects($this->any())->method('isPlain')->will($this->returnValue(true)); + $this->queue->expects($this->once())->method('load')->willReturnSelf(); + $this->queue->expects($this->once())->method('getTemplateId')->willReturn($templateId); + $this->queue->expects($this->once())->method('getNewsletterType')->willReturn($newsletterType); + $this->queue->expects($this->once())->method('getNewsletterText')->willReturn($newsletterText); + $this->queue->expects($this->once())->method('getNewsletterStyles')->willReturn($newsletterStyle); + $this->template->expects($this->any())->method('isPlain')->willReturn(true); + $this->template->expects($this->once())->method('setId')->willReturn($templateId); + $this->template->expects($this->once())->method('setTemplateType')->willReturn($newsletterType); + $this->template->expects($this->once())->method('setTemplateText')->willReturn($newsletterText); + $this->template->expects($this->once())->method('setTemplateStyles')->willReturn($newsletterStyle); /** @var \Magento\Store\Model\Store $store */ - $this->storeManager->expects($this->once())->method('getDefaultStoreView')->will($this->returnValue(null)); + $this->storeManager->expects($this->once())->method('getDefaultStoreView')->willReturn(null); $store = $this->createPartialMock(\Magento\Store\Model\Store::class, ['getId']); - $this->storeManager->expects($this->once())->method('getStores')->will($this->returnValue([0 => $store])); + $this->storeManager->expects($this->once())->method('getStores')->willReturn([0 => $store]); $result = $this->preview->toHtml(); $this->assertEquals('<pre></pre>', $result); }
app/code/Magento/OfflinePayments/composer.json+6 −5 modified@@ -6,12 +6,12 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-checkout": "*", - "magento/module-payment": "*" + "magento/framework": "102.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-payment": "100.3.*" }, "suggest": { - "magento/module-config": "*" + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -25,5 +25,6 @@ "psr-4": { "Magento\\OfflinePayments\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/OfflineShipping/composer.json+14 −13 modified@@ -6,20 +6,20 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-config": "*", - "magento/module-directory": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-sales-rule": "*", - "magento/module-shipping": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-config": "101.1.*", + "magento/module-directory": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-sales-rule": "101.1.*", + "magento/module-shipping": "100.3.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-checkout": "*", - "magento/module-offline-shipping-sample-data": "*" + "magento/module-checkout": "100.3.*", + "magento/module-offline-shipping-sample-data": "Sample Data version: 100.3.*" }, "type": "magento2-module", "license": [ @@ -33,5 +33,6 @@ "psr-4": { "Magento\\OfflineShipping\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/PageCache/composer.json+6 −5 modified@@ -6,10 +6,10 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-config": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-config": "101.1.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -23,5 +23,6 @@ "psr-4": { "Magento\\PageCache\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/PageCache/Controller/Block/Render.php+1 −1 modified@@ -11,7 +11,7 @@ /** * Page cache render controller * - * @deprecated + * @deprecated 100.3.4 */ class Render extends \Magento\PageCache\Controller\Block implements HttpGetActionInterface {
app/code/Magento/Payment/composer.json+9 −8 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-checkout": "*", - "magento/module-config": "*", - "magento/module-directory": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-config": "101.1.*", + "magento/module-directory": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\Payment\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/PaypalCaptcha/composer.json+7 −6 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-captcha": "*", - "magento/module-checkout": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-captcha": "100.3.*", + "magento/module-checkout": "100.3.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-paypal": "*" + "magento/module-paypal": "100.3.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\PaypalCaptcha\\": "" } - } + }, + "version": "100.3.2" }
app/code/Magento/Paypal/composer.json+20 −19 modified@@ -7,26 +7,26 @@ "require": { "php": "~7.1.3||~7.2.0||~7.3.0", "lib-libxml": "*", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-checkout": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-directory": "*", - "magento/module-eav": "*", - "magento/module-instant-purchase": "*", - "magento/module-payment": "*", - "magento/module-quote": "*", - "magento/module-sales": "*", - "magento/module-store": "*", - "magento/module-tax": "*", - "magento/module-theme": "*", - "magento/module-ui": "*", - "magento/module-vault": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-instant-purchase": "100.3.*", + "magento/module-payment": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-sales": "102.0.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*", + "magento/module-theme": "101.0.*", + "magento/module-ui": "101.1.*", + "magento/module-vault": "101.1.*" }, "suggest": { - "magento/module-checkout-agreements": "*" + "magento/module-checkout-agreements": "100.3.*" }, "type": "magento2-module", "license": [ @@ -40,5 +40,6 @@ "psr-4": { "Magento\\Paypal\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/PaypalGraphQl/composer.json+11 −10 modified@@ -6,17 +6,17 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-quote": "*", - "magento/module-checkout": "*", - "magento/module-paypal": "*", - "magento/module-quote-graph-ql": "*", - "magento/module-sales": "*", - "magento/module-payment": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-quote": "101.1.*", + "magento/module-checkout": "100.3.*", + "magento/module-paypal": "100.3.*", + "magento/module-quote-graph-ql": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-payment": "100.3.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-graph-ql": "*" + "magento/module-graph-ql": "100.3.*" }, "type": "magento2-module", "license": [ @@ -30,5 +30,6 @@ "psr-4": { "Magento\\PaypalGraphQl\\": "" } - } + }, + "version": "100.3.1" }
app/code/Magento/Paypal/Model/Api/Nvp.php+14 −14 modified@@ -1512,17 +1512,17 @@ protected function _applyStreetAndRegionWorkarounds(DataObject $address) } // attempt to fetch region_id from directory if ($address->getCountryId() && $address->getRegion()) { - $regions = $this->_countryFactory->create()->loadByCode( - $address->getCountryId() - )->getRegionCollection()->addRegionCodeOrNameFilter( - $address->getRegion() - )->setPageSize( - 1 - ); + $regions = $this->_countryFactory->create() + ->getRegionCollection() + ->addCountryFilter($address->getCountryId()) + ->addRegionCodeOrNameFilter($address->getRegion()) + ->setPageSize(1); $regionItems = $regions->getItems(); - $region = array_shift($regionItems); - $address->setRegionId($region->getId()); - $address->setExportedKeys(array_merge($address->getExportedKeys(), ['region_id'])); + if (count($regionItems)) { + $region = array_shift($regionItems); + $address->setRegionId($region->getId()); + $address->setExportedKeys(array_merge($address->getExportedKeys(), ['region_id'])); + } } } @@ -1624,7 +1624,7 @@ protected function _filterPeriodUnit($value) case 'year': return 'Year'; default: - break; + return ''; } } @@ -1653,7 +1653,7 @@ protected function _filterBillingAgreementStatus($value) case 'active': return 'Active'; default: - break; + return ''; } } @@ -1694,7 +1694,7 @@ protected function _filterPaymentStatusFromNvpToInfo($value) case 'Voided': return \Magento\Paypal\Model\Info::PAYMENTSTATUS_VOIDED; default: - break; + return null; } } @@ -1712,7 +1712,7 @@ protected function _filterPaymentReviewAction($value) case \Magento\Paypal\Model\Pro::PAYMENT_REVIEW_DENY: return 'Deny'; default: - break; + return null; } }
app/code/Magento/Persistent/composer.json+9 −8 modified@@ -6,13 +6,13 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-checkout": "*", - "magento/module-cron": "*", - "magento/module-customer": "*", - "magento/module-page-cache": "*", - "magento/module-quote": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-checkout": "100.3.*", + "magento/module-cron": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-page-cache": "100.3.*", + "magento/module-quote": "101.1.*", + "magento/module-store": "101.0.*" }, "type": "magento2-module", "license": [ @@ -26,5 +26,6 @@ "psr-4": { "Magento\\Persistent\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/ProductAlert/composer.json+8 −7 modified@@ -6,14 +6,14 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-customer": "*", - "magento/module-store": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-customer": "102.0.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-config": "*" + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -27,5 +27,6 @@ "psr-4": { "Magento\\ProductAlert\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/ProductVideo/composer.json+10 −9 modified@@ -6,17 +6,17 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", + "magento/framework": "102.0.*", "magento/magento-composer-installer": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-eav": "*", - "magento/module-media-storage": "*", - "magento/module-store": "*" + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-eav": "102.0.*", + "magento/module-media-storage": "100.3.*", + "magento/module-store": "101.0.*" }, "suggest": { - "magento/module-customer": "*", - "magento/module-config": "*" + "magento/module-customer": "102.0.*", + "magento/module-config": "101.1.*" }, "type": "magento2-module", "license": [ @@ -30,5 +30,6 @@ "psr-4": { "Magento\\ProductVideo\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/QuoteAnalytics/composer.json+5 −4 modified@@ -3,9 +3,9 @@ "description": "N/A", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-quote": "*", - "magento/module-analytics": "*" + "magento/framework": "102.0.*", + "magento/module-quote": "101.1.*", + "magento/module-analytics": "100.3.*" }, "type": "magento2-module", "license": [ @@ -19,5 +19,6 @@ "psr-4": { "Magento\\QuoteAnalytics\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/Quote/composer.json+18 −17 modified@@ -6,24 +6,24 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-authorization": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-checkout": "*", - "magento/module-customer": "*", - "magento/module-directory": "*", - "magento/module-eav": "*", - "magento/module-payment": "*", - "magento/module-sales": "*", - "magento/module-sales-sequence": "*", - "magento/module-shipping": "*", - "magento/module-store": "*", - "magento/module-tax": "*" + "magento/framework": "102.0.*", + "magento/module-authorization": "100.3.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-checkout": "100.3.*", + "magento/module-customer": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-payment": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-sales-sequence": "100.3.*", + "magento/module-shipping": "100.3.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*" }, "suggest": { - "magento/module-webapi": "*" + "magento/module-webapi": "100.3.*" }, "type": "magento2-module", "license": [ @@ -37,5 +37,6 @@ "psr-4": { "Magento\\Quote\\": "" } - } + }, + "version": "101.1.4-p2" }
app/code/Magento/QuoteGraphQl/composer.json+13 −12 modified@@ -4,19 +4,19 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-quote": "*", - "magento/module-checkout": "*", - "magento/module-catalog": "*", - "magento/module-store": "*", - "magento/module-customer": "*", - "magento/module-customer-graph-ql": "*", - "magento/module-sales": "*", - "magento/module-directory": "*", - "magento/module-graph-ql": "*" + "magento/framework": "102.0.*", + "magento/module-quote": "101.1.*", + "magento/module-checkout": "100.3.*", + "magento/module-catalog": "103.0.*", + "magento/module-store": "101.0.*", + "magento/module-customer": "102.0.*", + "magento/module-customer-graph-ql": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-directory": "100.3.*", + "magento/module-graph-ql": "100.3.*" }, "suggest": { - "magento/module-graph-ql-cache": "*" + "magento/module-graph-ql-cache": "100.3.*" }, "license": [ "OSL-3.0", @@ -29,5 +29,6 @@ "psr-4": { "Magento\\QuoteGraphQl\\": "" } - } + }, + "version": "100.3.4" }
app/code/Magento/QuoteGraphQl/Model/Resolver/SetPaymentAndPlaceOrder.php+1 −1 modified@@ -22,7 +22,7 @@ /** * Resolver for setting payment method and placing order * - * @deprecated Should use setPaymentMethodOnCart and placeOrder mutations in single request. + * @deprecated 100.3.4 Should use setPaymentMethodOnCart and placeOrder mutations in single request. * @see \Magento\QuoteGraphQl\Model\Resolver\SetPaymentMethodOnCart * @see \Magento\QuoteGraphQl\Model\Resolver\PlaceOrder */
app/code/Magento/Quote/Test/Mftf/Test/StorefrontGuestCheckoutDisabledProductTest.xml+3 −0 modified@@ -87,6 +87,9 @@ <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/> <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductListing"/> <actionGroup ref="resetProductGridToDefaultView" stepKey="resetGridToDefaultKeywordSearch"/> + + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> </after> <!-- Step 1: Add simple product to shopping cart --> <amOnPage url="{{StorefrontProductPage.url($$createSimpleProduct.name$$)}}" stepKey="amOnSimpleProductPage"/>
app/code/Magento/RelatedProductGraphQl/composer.json+6 −5 modified@@ -4,12 +4,12 @@ "type": "magento2-module", "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-catalog": "*", - "magento/module-catalog-graph-ql": "*", - "magento/framework": "*" + "magento/module-catalog": "103.0.*", + "magento/module-catalog-graph-ql": "100.3.*", + "magento/framework": "102.0.*" }, "suggest": { - "magento/module-graph-ql": "*" + "magento/module-graph-ql": "100.3.*" }, "license": [ "OSL-3.0", @@ -22,5 +22,6 @@ "psr-4": { "Magento\\RelatedProductGraphQl\\": "" } - } + }, + "version": "100.3.1" }
app/code/Magento/ReleaseNotification/composer.json+25 −24 modified@@ -1,27 +1,28 @@ { - "name": "magento/module-release-notification", - "description": "N/A", - "require": { - "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/module-user": "*", - "magento/module-backend": "*", - "magento/module-ui": "*", - "magento/framework": "*" - }, - "suggest": { - "magento/module-config": "*" - }, - "type": "magento2-module", - "license": [ - "OSL-3.0", - "AFL-3.0" - ], - "autoload": { - "files": [ - "registration.php" + "name": "magento/module-release-notification", + "description": "N/A", + "require": { + "php": "~7.1.3||~7.2.0||~7.3.0", + "magento/module-user": "101.1.*", + "magento/module-backend": "101.0.*", + "magento/module-ui": "101.1.*", + "magento/framework": "102.0.*" + }, + "suggest": { + "magento/module-config": "101.1.*" + }, + "type": "magento2-module", + "license": [ + "OSL-3.0", + "AFL-3.0" ], - "psr-4": { - "Magento\\ReleaseNotification\\": "" - } - } + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReleaseNotification\\": "" + } + }, + "version": "100.3.4-p2" }
app/code/Magento/Reports/composer.json+19 −18 modified@@ -6,23 +6,23 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*", - "magento/module-backend": "*", - "magento/module-catalog": "*", - "magento/module-catalog-inventory": "*", - "magento/module-cms": "*", - "magento/module-config": "*", - "magento/module-customer": "*", - "magento/module-downloadable": "*", - "magento/module-eav": "*", - "magento/module-quote": "*", - "magento/module-review": "*", - "magento/module-sales": "*", - "magento/module-sales-rule": "*", - "magento/module-store": "*", - "magento/module-tax": "*", - "magento/module-widget": "*", - "magento/module-wishlist": "*" + "magento/framework": "102.0.*", + "magento/module-backend": "101.0.*", + "magento/module-catalog": "103.0.*", + "magento/module-catalog-inventory": "100.3.*", + "magento/module-cms": "103.0.*", + "magento/module-config": "101.1.*", + "magento/module-customer": "102.0.*", + "magento/module-downloadable": "100.3.*", + "magento/module-eav": "102.0.*", + "magento/module-quote": "101.1.*", + "magento/module-review": "100.3.*", + "magento/module-sales": "102.0.*", + "magento/module-sales-rule": "101.1.*", + "magento/module-store": "101.0.*", + "magento/module-tax": "100.3.*", + "magento/module-widget": "101.1.*", + "magento/module-wishlist": "101.1.*" }, "type": "magento2-module", "license": [ @@ -36,5 +36,6 @@ "psr-4": { "Magento\\Reports\\": "" } - } + }, + "version": "100.3.4-p2" }
app/code/Magento/RequireJs/composer.json+3 −2 modified@@ -6,7 +6,7 @@ }, "require": { "php": "~7.1.3||~7.2.0||~7.3.0", - "magento/framework": "*" + "magento/framework": "102.0.*" }, "type": "magento2-module", "license": [ @@ -20,5 +20,6 @@ "psr-4": { "Magento\\RequireJs\\": "" } - } + }, + "version": "100.3.4" }
Vulnerability mechanics
Synthesis attempt was rejected by the grounding validator. Re-run pending.
References
4- github.com/advisories/GHSA-j2jp-58gv-g2pgghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2020-9580ghsaADVISORY
- github.com/magento/magento2/commit/52d92dbd07f09620d23693ba0c4d4bdb4ba09916ghsaWEB
- helpx.adobe.com/security/products/magento/apsb20-22.htmlghsax_refsource_CONFIRMWEB
News mentions
0No linked articles in our index yet.